本文共 1236 字,大约阅读时间需要 4 分钟。
当读取文本文件内容的时候,常常会出现中文的编译乱码问题,所以本文从原理上解决编码识别问题。
(1) ASCII码
因为计算机只识别二进制,所以为了解决编码问题,人们采用ASCII码来解决信息转换,使用8位来表征1个字节,则可共代表128个字符(2的7次)。 其中 0-31 控制符: 换行,回车,换页,删除等… 32-126 传统字符 : 48-57 : 阿拉伯数字 65-90 : 26个大写字母 97-122: 26个小写字母 127 控制符(2)GBK码 : 解决中文编码问题
为了增加中文,则衍生出 GB2312编码格式 为了增加繁体字,则衍生出 GBK码 为了增加多民族字 , 则衍生出 GB18030 编码格式(3)unicode编码字符集
最后,ISO为了统一所有的字符集,提出了unicode这一统一的字符标准,认定英语字母和汉字都算一个字符即两个字节(一个字符两个字节),进行了统一。然后unicode又衍生出两个传输标准 utf-8 ,utf-16进行信道编码(unicode为信源编码),所以说unicode和utf-8不是一一对应的,需要按照一定的规则进行转换。如,中文在unicode占两个字节,在utf-8占3个字节。但同时发生的问题就是,本来字母占一个字节即可,unicode认为占用两个字节那么高8位就是 0,浪费了空间。
(4)unicode,utf-8,gbk的区别和联系
unicode是字符集,而 utf-8 是一种变长的编码方式,但是unicode和utf-8不是一一对应的,utf-8采用了ASCII码范围中的字符认定为一个字节,而对应的中文则认定为2个字节,这和unicode字符集中认定中文和字母都是两个字节。utf-8 编码格式能够代表所有的文字,所以功能强大, 占用的空间大。而gbk作为仅仅对应的中文的编码格式,占用的空间少,所以对于中国用户群体,采用gbk节省空间和性能也是常见的。
python 的编码乱码问题
字符创在python内部采用unicode字符集,除了ASCII码,像中文在字符集中存储的格式是\x65\xa23\u94c1\u9a6…..所以unicode是不直接显式的识别中文的,则需要将中文装解码 decode 成计算机识别的unicode码,然后再编码转换成utf-8编码输出,则可以显式的出现中文。函数decode()
decode([encode],[errors=’strict’]) 第二个参数控制错误处理策略,默认是 strict遇到非法字符抛出异常
s.decode(“gbk”,’strict’) 忽视非法字符 s.decode(“gbk”,’ignore’) 用?代替非法字符 s.decode(“gbk”,’replace’) 用xml字符引用 s.decode(“gbk”,’xmlcharrefreplace’)