Python字符编码
字符编码
ASCII 占1个字节,只支持英文
GB2312 占2个字节,支持6700+汉字
GBK GB2312的升级版,支持21000+汉字
Unicode 2-4字节 已经收录136690个字符
直接支持全球所有语言,unicode包含了跟全球所有国家编码的映射关系
Unicode 表示一个字符,太浪费空间,比较ASCII多了一倍
内存比较大,字符串在内容中表示也不会太大,所以内容可以用unicode来处理
但是存储和网络传输一般会非常多,增加一倍是不行的
所以出现UTF,对unicode进行转换,存储和网络传输是节省空间
UTF-8 用1,2,3,4字节表示所有字符,优先使用一个字符,不够增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
UTF-16 用2,4个字节字节表示所有字符,优先使用2个字符,否则就使用4个字节表示
UTF-32 用4个字节字节表示所有字符
存在硬盘的数据都是二进制,存储在硬盘时候是什么编码,再读的时候,也要用相同编码读
各自国家软件都使用自己的国家编码,导致拿到其他国家用,产生乱码,但是unicode有全球编码映射关系,只要将数据加载内存,通过unicode来显示。

Unicode 对应了好几个编码格式
Python3 执行过程
解析器找到代码文件,将代码字符串按照文件头定义的编码加载到内存,转换成unicode
代码字符串按照语法解析执行
所有变量字符按unicode编码声明
windows终端默认是GBK编码,之所以能显示正常,是因为加载内存,解释器在utf-8转换成unicode。
Python3默认是unicode,但Python2是ASCII,就必须声明编码。
Python2 解释器按照声明的编码解释代码,加载内存并不会转换成unicode。会导致utf-8代码,在windows下会乱码
强制转换
UTF-8 --> decode 解码 --> Unicode
Unicode --> encode 编码 --> GBK / UTF-8
utf-8一个中文占3字节,gbk一个占2字节
GBK编码是'\xc2\xb7\xb7\xc9\xd1\xa7\xb3\xc7' 一个中文应该\xc2\xb7 映射表里却是G0-4237,但是第2位是对应了
解码GBK的16进制编码,2个字节是一个中文,4个16进制等于2个字节。
去匹配映射表会发现对应不上,将16进制转换二进制,将二进制字节的左边第一个变成0,换成16进制,会发现匹配上了
为实现和ASCII兼容,ASCLI英文,就用一个字节表示,2个字节就是中文。但是如果个英文字母怎么表示呢,于是2个字节连在一起用,如果每个字节的第1位如果是1,就代表这是个中文,这个首位是128的字节被称为高字节。 也就是2个高字节连在一起,必然就是一个中文。
unicode在映射表的表达上直接忽略了高字节,导致这个情况
Python bytes类型
字节类型, 它把8个二进制一组称为一个byte,用16进制来表示。
python2的字符串其实更应该称为字节串bytes == str ,后面为了支持全球语言出现 unicode字符类型 , 把字符串解码后,就会变成unicode
python3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制啦。
py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。
常见编码错误的原因有:
Python解释器的默认编码
Python源文件文件编码
Terminal使用的编码

浙公网安备 33010602011771号