python基础--编码

编解码

  • 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
  • py3中默认的编码格式是utf-8,utf-8编码中文一般为3个字节,gbk一般是2个字节
  • py3默认类似是str类型(即unicode类型),在文件中保存的类型都是bytes类型
                默认是str类型(unicode)----->>>>不能直接写入到文件中,也不能再网络上传输(必须编码后传输                 bytes类型------->>>>用于网络传输                 网页源码----->>>>charset------->>>>字符集 encode编码/decode解码 Unicode类型(str)---->通过encode(编码)----->转为bytes类型(utf-8,ascii,gbk bytes类型(utf-8,ascii,gbk)---->通过decode(解码)----->转为Unicode类型(str)       py2
  • 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的

 

     
上一篇:为什么java.net.URLEncoder对相同的字符串给出不同的结果?


下一篇:C++实现base64编解码