博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符编码
阅读量:5085 次
发布时间:2019-06-13

本文共 2295 字,大约阅读时间需要 7 分钟。

位与字节:

8位一个字节
计算机的数据以字节为单位,存储时以位为单位

ascii

unicode
utf8

①中文编码知识:

ASCII字符集:American Standard Code for Information Interchange美国信息交换标准码
用8bit来表示一个字符,总共可以表示256个字符。
英文字母再加一些其他标点字符之类的也不会超过256个,故只支持英文。
GB2312:是对 ASCII 的中文扩展。占两个字节。
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。
前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,
支持6700+汉子。

GBK 标准:GB2312扩展之后的编码方案,之后由于多民族的语言系统,GBK 编码扩充为 GB18030 编码。

Unicode:2-4个字节(16bit)来表示字符,是一个字符集,已经收录136690个字符,并还在一直不断扩张中。

第一步:Unicode是用0至最大值之间的数字来表示所有字符.其中0至127这128个数字表示的字符仍然跟ASCII完全一样.
第二步:怎么把0至最大值这些数字转化成01串保存到计算机中和进行传输。
于是出现了UTF(unicode transformation format),一种编码规则。
有UTF-8:使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
UTF-16:使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
UTF-32:使用4个字节表示所有字符;

在py2中,有两种字符串类型:str类型和unicode类型,str存字节数据,unicode存unicode数据;

在py3中,也有两种数据类型,str和bytes; str类型存unicode数据,bytes类型存bytes数据

无论py2,还是py3,与明文直接对应的就是unicode数据,打印unicode数据就会显示相应的明文(包括英文和中文)

存到磁盘上的数据是bytes,离计算机更近的数据。

比如
编辑器
当我们保存的的时候,hello.py文件就以pycharm默认的编码方式保存到了磁盘;
关闭文件后再打开,pycharm就再以默认的编码方式对该文件打开后读到的内容进行解码,
转成unicode到内存我们就看到了我们的明文;

解释器

在运行的时候,先解码成unicode,这个过程和编辑器是一样的(解码的时候不是加载到内存,而是在解释器的运行环境内,作string编码),
再译成C代码再转成二进制的数据流,CPU执行数据流后得到结果内容,
然后将内容加载到内存中,被使用的编辑软件显示出来。

解码了的文本只存在运行环境中,如果你需要打印/保存/输出给数据库/网络传递(加载到内存),就又需要一次编码过程

python的编码分为编辑器和解释器。

解释器:py2默认ASCII码,py3默认的utf8

所以,py2有个问题, 它的默认编码是ASCII,想写中文,就必须声明文件头的coding为gbk or utf-8,

声明之后,python2解释器仅以文件头声明的编码去解释你的代码(unicode)并通过CPU执行,
执行结果(声明的utf-8)加载到内存后,并不会主动帮你转为unicode,而py3则会主动转换。
(原因就是默认的编码方式不同,py3是utf8,传达到内存的时候类似编辑器角色,会自动转码unicode)。
也就是说,py2的声明文件编码是utf-8,加载到内存里,你的变量字符串就也是utf-8,
解释的编码方式不同于编辑的编码方式,py2的默认编码是ASCII,在编辑的时候不能将utf8转unicode,会保持utf8。
意味着,你以utf-8编码的文件,在windows的显示软件(如cmd,默认编码方式gbk)会乱码。

2018/1/18 周四

①python给我们提供了一个包codecs进行文件的读取,这个包中的open()函数可以指定编码的类型:

import codecs

f = codecs.open('text.text','r+',encoding='utf-8')
#必须事先知道文件的编码格式,这里文件编码是使用的utf-8

content = f.read()

#如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将会产生错误

f.write('你想要写入的信息')

f.close()

②>>> s

'\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8 (比如CPU运行后的结果)
>>> s.decode('utf-8') (如果解释器默认的编码规则为utf-8,则会自动执行这一步)
u'\u8def\u98de' #unicode 在unicode编码表里对应的位置
>>> print(s.decode('utf-8')) (pirnt的时候输出前要根据显示软件的编码规则对unicode进行编码)
路飞 #unicode 格式的字符
常见编码错误的原因有:

Python解释器的默认编码

Python源文件文件编码
Terminal使用的编码
操作系统的语言设置

转载于:https://www.cnblogs.com/czlong/p/9382241.html

你可能感兴趣的文章
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
IOS--沙盒机制
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
Mongo自动备份
查看>>
cer证书签名验证
查看>>
synchronized
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
QML学习笔记之一
查看>>
Window 的引导过程
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>