读取文件的编译乱码问题

版权声明:所爱隔山海。 https://blog.csdn.net/tongxinzhazha/article/details/78549749

前言

当读取文本文件内容的时候,常常会出现中文的编译乱码问题,所以本文从原理上解决编码识别问题。

第一部分 原理部分

(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’)

猜你喜欢

转载自blog.csdn.net/tongxinzhazha/article/details/78549749
今日推荐