python2/python3 编码问题

1、编码解码

1.1、概念

  • 比特 / bit:计算机中最小的数据单位,是单个的二进制数值 0 或 1

  • 字节 / byte:计算机存储数据的单元,1 个字节由 8 个比特组成

  • 字符:人类能够识别的符号

  • 编码:将人类可识别的字符转换为机器可识别的字节码 / 字节序列

  • 解码:编码的反向过程叫解码

  • 概述:Unicode 是人类可识别的字符格式;ASCIIUTF-8GBK 等都是机器可识别的字节码格式。我们写在文件中的 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 编码

 python2python3
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

https://nedbatchelder.com/text/unipain/unipain.html#1

https://zhuanlan.zhihu.com/p/33220501

posted @ 2020-05-27 21:09  heaventouch  阅读(213)  评论(0编辑  收藏  举报