- 编码和解码
- 编码集
- 解决乱码
编码和解码
- 编码是为了让机器读懂语言。即输入的是字符“中文”,那么编码就是将“中文”编码为二进制格式让机器读懂
- 在Python中,机器其实是不认识unicode 的,而是接收的 str
- 即使输入的数据是 unicode 的,而在Python内部都会将 unicode 自动转为str
- str 通过解码函数 decode() 转换为 unicode , unicode 通过编码函数 encode() 转换为 str
编码集
- 电脑只”认识” 0 1 二进制数值,从一开始,人们想到的方法就是赋予每一个字符唯一的一串 0 1 编码表示。
- 这是一个ASCII编码集中对字符 A 的编码,这是一个八位 0/1 数字
ASCII编码集 - 在1967年出现了ASCII标准,这主要是基于拉丁字母的一套电脑编码系统
- ASCII标准是每个英文字母有一一对应独立的 8 位数字串,比如说字母 A ,ASCII中对应的二进制值为 01000001 。这样,我在输入 A 的时候,编译器会借助编码集将 A 转换为 01000001
- ASCII总共可以存储256个字符,1967年制定这套标准的人只考虑英语世界的使用者。那么256个编码集对于使用英语和拉丁语系是够用的,但是对于中文、日文、韩文,就完全不够用了
GB2312编码
- GB2312编码集是由中国国家标准总局发布
- 1981年5月1日实施的一套收录了6763个汉字、拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符的标准。但是这套标准没有包含部分罕见字和繁体字,于是后面出现GBK、GB18030在GB2312的基础上进行扩充解决。
Unicode
- Unicode是标准统一所有语言文字的标准编码集,它目前已经收录超过十万个字符
- Unicode包括两个方面
- 编码方式(一个字符对应编码集中的二进制数值)
- 实现方式(传输、存储):UTF-8、UTF-16
解释乱码
解释器编码
- Python解释器的编码指Python内部认为的字符 str 的编码,即一个 str 变量,要转换为 unicode时,Python解释器默认的转换方式
- Python的默认转换方式是ASCII
*sys.getdefaultencoding()*函数可以获得默认编码信息
- 在 ASCII 默认编码条件下对中文字符编码会出现错误,因为 ASCII 不能对中文进行编码
- 通过前面介绍的 encode() 函数和 decode() 函数可以设置参数,指定编码方式
- 对中文字符进行 GBK 编码和 UTF-8 编码
- 中文字符 str 的解码问题
- 想要得到 GBK 编码的 str :先对其进行 UTF-8 解码,再对其进行 GBK 编码
源文件编码 - 源文件编码也就是代码文件的编码,文件不仅可以保存代码,而且还可以对数据进行存储
- 文件保存数据也是有编码的,如果源文件中有中文,那么直接按照默认的编码方式运行Python文件的时候会出现编码错误,若想要在源码中写非ASCII文字,可以在源码文件开头加入一行:
或者
终端编码 - 这个指使用终端显示的时候会出现的问题
- windows中文版终端用的是CP936,通常被等同认为是GBK
- 而linux系统终端用的是utf-8
- 所以若不想在终端打印显示出来的字符出现乱码,则在打印前需要将打印的内容按照终端相同的编码方式进行转换
文件读写编码 - 在数据分析中,出现编码问题最多的还是在文件读写这个阶段
- 使用 read() 读取的文件内容,得到的是 str 格式的
- 用 UTF-8 解码再用 GBK 编码打印出来的是乱码,这就是编码不同导致的乱码
- 用 write() 方法写入的时候也需要是 str 格式。也就是说,如果写入的数据是 unicode 时,将会出错
- 解决办法:先将 unicode 格式编码为 str ,再写入
编码检测工具——chardet
- 如果你发现常用的 gbk 、 utf-8 编码解码都没办法解决乱码问题,那么有可能该文本使用了这两种之外的编码方式
- chardet是一个Python包,提供测试文本的编码方法,最后返回的是对编码方法的一个估计