位与字节:
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-8content = 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使用的编码 操作系统的语言设置