字符编码问题

学Python,看到廖老师的文章,介绍了字符编码的问题,就按照文章的内容进行了测试,得到了不太一样的结果。

不过在看结果之前,先总结一下字符编码的历史背景,捋清楚最常见的三种字符编码ASCII,Unicode和Utf-8的差别。

字符编码发展

先看这张表:

字符	ASCII		Unicode			Utf-8
A 01000001 00000000 01000001 01000001
中 x 01001110 00101101 11100100 10111000 10101101

最开始的ASCII只能表示英文和基本的字符,中文是不支持的;

之后的Unicode做了统一处理,无论英文还是其他字符都用2个字节表示,即UCS-2方案,随着世界上各种国家更多字符需要表示,Unicode的2个字节如果无法满足需要,就将采用UCS-4方案,用4个字节表示;

Unicode的问题在于浪费空间,比如普通英文字符,最高8位全是0,鉴于此,产生了Utf-8。Utf-8是对Unicode编码通过一些算法和规则来转换得到的,是变长的编码,英文编码只用1个字节,汉字则是3个字节。

Python2和Python3默认字符编码

Python中默认的字符编码可以执行:

import sys
sys.getdefaultencoding()

Python2和Python3的输出不同,前者为ascii,后者为utf-8