Python的字符编码问题

Unicode的2个作用:

直接支持全球所有语言
unicode包含了跟全球所有国家编码的映射关系。

 Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。
内存中可以使用unicode来处理,但是不适合存储和网络传输

UTF 是为unicode编码设计的一种在存储和传输时节省空间的编码方案。

UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。

UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。

UTF-32: 使用4个字节表示所有字符。


无论以什么编码在内存里显示字符,存到硬盘上都是2进制。
存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读

无论你以什么编码存储的数据,只要你的软件在把数据从硬盘读到内存里,转成unicode来显示,就可以了。
Python3解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode

Python2并不会自动的把文件编码转为unicode存在内存里。只有手动转

Python的字符编码问题

s = '前程什锦'
print(s)
s1 = s.decode("utf-8") # utf-8 转成 Unicode,decode(解码)需要注明当前编码格式
print(s1,type(s1))

s2 = s1.encode("gbk") # unicode 转成 gbk,encode(编码)需要注明生成的编码格式
print(s2,type(s2))

s3 = s1.encode("utf-8") # unicode 转成 utf-8,encode(编码)注明生成的编码格式
print(s3,type(s3))