Python2 编码问题分析 (2)

Python2 编码问题分析

汉字“中”的编码三种编码方式

'\xd6\xd0'(GBK)  <==> u'\u4e2d'(UNICODE) <==> '\xe4\xb8\xad'(UTF-8)

在win7 + python2.7的环境下,Python 自带的IDE中输入的中文默认编码方式为GBK

Python2 编码问题分析

字符串 '3132' 的编码是 '\x31\x32\x33\x34'

Python2 编码问题分析

 

Python2 编码问题分析

对应第二节表中的数值可以清楚的看到相同的字符对应的不同的编码。

也可以说明UTF-8和GBK的编码兼容ASCII。而ASCII表示的字符在Unicode中则需要两个字节表示。

一个以ASCII编码的文档(注意不是ANSI编码)可以使用UTF-8和GBK编码方式打开,而不能使用Unicode。

为了进一步验证,新建notepad++文档,选择编码方式为ANSI(即GBK),用喜欢的输入法以最快的方式键入汉字“中”。

Python2 编码问题分析

使用HEX-Editor插件查看文档的GBK编码二进制表示:

 

Python2 编码问题分析

“中”的UTF-8编码二进制表示:

Python2 编码问题分析

“中”的Unicode(对应notepad++中的USC-2 Big Endian)编码二进制表示:

 

Python2 编码问题分析

和python2中的结果相比可以看出

Python2 编码问题分析

 除了Unicode字符外,文件中存储的二进制数据和对应的编码是一一对应的。而这也验证了先前说的Unicode对象本身包含的并不是字节。

\u是unicode编码的转义字符,上面起始的0xfeff可以看做unicode编码文件的一个起始标记。

例如

Unicode:       前两个字节为FFFE;
Unicode big endian:  前两字节为FEFF; 

实际读取文件时会根据文件的前两个字节就可以判定出文件的具体格式。

使用gbk的方式读取utf-8编码文件(将utf-8文件编码方式改为ANSI),将会以GBK的方式解读字utf-8的节序列'\xe4\xb8\xad',结果如下:

Python2 编码问题分析

反之,使用utf-8的方式读取GBK编码文件(以utf-8的方式解读字GBK的节序列'\xd6\xd0'):

Python2 编码问题分析

4.文件显示标注编码类型

在python文件中我们可以使用下面的方式标记文件的编码类型:

# -*- coding:utf-8 -*-

#coding:utf-8

关于python文件编码类型的声明可以参考官网: PEP 263

网上有很多人认为上面的编码声明定义了python文件的编码方式,但与其说定义python文件的编码方式,不如说是这仅仅是对python解释器的一种编码方式声明。即python 文件的编码声明 # -*- coding: utf-8 -*- 只是给python解释器看的。当python解释器执行py文件时会根据这个声明来解析文件编码格式。

也就是说这个声明和文件本身实际的文件编码没有关系。但两者最好保持一致,否者python解释器会以错误的方式去解码文件内容并执行。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppzyx.html