python2/python3 编码问题
1、编码解码
1.1、概念
-
比特 /
bit
:计算机中最小的数据单位,是单个的二进制数值 0 或 1 -
字节 /
byte
:计算机存储数据的单元,1 个字节由 8 个比特组成 -
字符:人类能够识别的符号
-
编码:将人类可识别的字符转换为机器可识别的字节码 / 字节序列
-
解码:编码的反向过程叫解码
-
概述:
Unicode
是人类可识别的字符格式;ASCII
、UTF-8
、GBK
等都是机器可识别的字节码格式。我们写在文件中的 py3 代码,是由字符组成的,它们的格式,就是Unicode
,而字符是以字节为存储单位保存在文件中,文件保存在内存 / 物理磁盘中
1.2、编码格式
ASCII:计算机就可以使用127个不同字节来存储英语文字
GB2312:前面一个字节为高字节(0xA1-0xF7),后面一个字节为低字节(0xA1-0xFE),可以表示7000多个汉字;是对ASCII的中文扩展
GBK:GB2312扩展后的编码成为GBK, GBK包括了GB2312的所有内容,同时增加了近20000个新的汉字(包括繁体)和符号
Unicode:Unicode 用两个字符来表示一个字符,可以提供65535种字符,足够覆盖世界上的所有符号
utf-8:一种针对Unicode的可变长度字符编码,可以使用1-4个字节表示一个符号,根据不同的符号变化字节长度,当字符在ASCII编码范围时,用一个字节表示,兼用ASCII
Unicode和utf-8的关系:Unicode是内存编码表示方案(规范),而utf-8是如何保存和传输Unicode的方案(实现)
2、Python2/Pyhon3中的String编码
Python2 的默认编码是 ASCII
,不能识别中文字符,需要显式指定字符编码
Python3 的默认编码为 Unicode
,可以识别中文字符
计算机内存中的数据,统一使用 Unicode
编码
数据传输或保存到硬盘上,使用 UTF-8
编码
python2 | python3 | |
---|---|---|
str | a sequence of bytes | a sequence of code points (unicode) |
unicode | a sequence of code points (unicode) | —— |
bytes | —— | a sequence of bytes |
python3中的bytes等于python2中的str,是机器识别的字节码对应utf-8编码,只能进行 decode 解码;
python3中的str等于python2中的unicode,是人识别的字符串对应unicode编码,只能进行 encode 编码;
Python2中有隐式转换,Python3中没有;
隐式转换:Python2 掩盖掉了 byte 到 unicode 的转换,只要数据全部是 ASCII 的话,所有的转换都是正确的,一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效造成 UnicodeDecodeError 的错误。
3、编码问题
-
python3中分清是str 还是 bytes;python2中分清是str还是unicode;
-
确定字符集是否包含当前字符的编码,如ASCII不能encode中文字符;
-
确定编码解码方式一致;
4、参考引用
https://zhuanlan.zhihu.com/p/38293267
https://www.jianshu.com/p/5682a0e0a9ba
https://blog.csdn.net/hjxzb/article/details/81842747