编解码
- ASCII:1字节,0-255
- GBK2313:常用的汉字,2万多个
- GBK:对GBK2313的补充,支持藏文,2个字节表示一个汉字
- big5:*,繁体字
- unicode:万国码,2-4字节,只是在内存中使用,传输或者保存时要编码
- UTF:Unicode transformation format
- UTF-8:变长,1-4个字节,兼容ASCII,汉字2字节,好处是省空间,但是浪费时间
- UTF-16:2字节
- UTF-32:4字节
总而言之:
- Unicode定义世界每个字符的索引值。
- Unicode编码:包含全世界的所有字符,但是,他只是用来在内存中使用。一旦需要存储到文件或者是网络传输,默认计算机系统不支持unicode。
如果必须要存储到文件或者网络传输时:我们必须用bytes类型(gbk或utf-8编码的bytes类型字符串)。
我们用gbk还是utf-8?
你的应用程序是针对所有的处理都是utf-8,那么你传输的数据就要必须是utf-8- UTF8/UTF16实现Unicode的标准,把字符存储到存储介质中。
- py3中默认的编码格式是utf-8,utf-8编码中文一般为3个字节,gbk一般是2个字节
- py3默认类似是str类型(即unicode类型),在文件中保存的类型都是bytes类型
- py2默认类型是str类型(即bytes类型)
bytes类型---->通过decode(解码)---->转化为Unicode类型(str)
Unicode类型---->通过encode(编码)----->转化为bytes类型
总结: encode:都是用来得到非unicode类型字符串 decode:都是用来获取unicode类型#py3里面的字符串 >>> s="a" >>> type(s) #py3对应的str是unicode类型 <class 'str'>
>>> s1=b'a' #py3中前面加b是变成bytes类型
>>> type(s1)
<class 'bytes'>
>>> s="中国" >>> s.encode("utf-8") #encode编码后转为bytes类型 b'\xe4\xb8\xad\xe5\x9b\xbd' #bytes类型前面有个b开头 >>> type(s.encode("utf-8")) <class 'bytes'> >>> >>> s.encode("gbk") #str类型转化为bytes类型需要encode编码一下 b'\xd6\xd0\xb9\xfa' >>> s.encode("gbk").decode("gbk") #bytes类型转为str类型需要decode一下 '中国' >>> type(s.encode("gbk").decode("gbk")) <class 'str'> >>> 注意:写入文件时,必须encode后才能写入注意:用什么编码就对应的用什么解码,否则会报错或者乱码
>>> s="光荣之路测试开发培训".encode("gbk")#用gbk编码
>>> s
b'\xb9\xe2\xc8\xd9\xd6\xae\xc2\xb7\xb2\xe2\xca\xd4\xbf\xaa\xb7\xa2\xc5\xe0\xd1\x
b5'
>>> s.decode("utf-8")#用utf-8解码
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 0: invalid#报错:'utf-8'编解码器不能解码字节0xb9在位置0:无效
start byte
>>>
>>> s.decode("gbk")#用gbk解码
'光荣之路测试开发培训'
>>>
#py2里面的字符串 >>> s="abc" >>> type(s) #py2对应的str是bytes类型 <type 'str'> >>> >>> s.decode("gbk") #py2str类型不能encdoe,只能先decode, u'abc' #解码后是unicode,开头加了u >>> type(s.decode("gbk")) <type 'unicode'> >>> print s.decode("gbk") abc >>> print s.decode("gbk").encode("gbk") abc >>>
注:如果记不住可以不用管py2里的情况只记py3的