编码问题一直是pythoner绕不过去的坎儿,这里记录下自己思考的内容,仅作参考
网上关于这方面的文章已经有很多,这里列举几篇参考的博文 Python字符编码详解 Unicode和Python的中文处理 python的str,unicode对象的encode和decode方法 python encode和decode函数说明
用于显示的字符集需要唯一ID可以被计算机识别,这样的ID映射就是编码; 最开始的 ASCII(American Standard Code for Information Interchange)提供了单字节编码方式,即一个字节表示一个字符,实现的是对英文和大多数控制符号的编码; 但是128的数量却无法满足其他国家的语言,特别是中文,所以针对不同语言的编码逐渐产生,但是不同的编码就注定文本无法在不同系统上被正确解码,为了解决这个问题,Unicode应运而生; Unicode有两种标准, UCS-2 和 UCS-4; 差别在于 UCS-2 使用两个字节来表示一个字符,UCS-4用4个字节表示一个字符;现在用的居多的仍然是 UCS-2; P.S: Unicode编码表可以参考这篇博文 unicode编码表 UCS-2 使用两个字节表示一个字符,那么对于原先只需要一个字节就可以表示的英文,就是个问题,占用额外的空间,且Unicode双字节引擎无法处理ASCII码的单字节编码,所以为了让Unicode可以兼容ASCII,产生了变种的版本 UTF-8 ; 或者更准确的说 UTF-8是Unicode的实现方式之一
关于 UTF-8的介绍,在 Unicode和Python的中文处理中有详细的介绍,这里引用一段内容:
UTF-8编码分为四个区: 一区为单字节编码, 编码格式为:0xxxxxxx; 对应Unicode:0x0000 - 0x007f 二区为双字节编码, 编码格式为:110xxxxx 10xxxxxx; 对应Unicode:0x0080 - 0x07ff 三区为三字节编码, 编码格式为:1110xxxx 10xxxxxxx 10xxxxxx 对应Unicode:0x0800 - 0xffff 四区为四字节编码, 编码格式为:11110xxx 10xxxxxxx 10xxxxxx 10xxxxxx 对应Unicode:0x00010000 - 0x0001ffff 五区为五字节编码, 编码格式为:111110xx 10xxxxxxx 10xxxxxxx 10xxxxxxx 10xxxxxxx 对应Unicode:0x00200000 - 0x03ffffff 六区为六字节编码, 编码格式为:111110x 10xxxxxxx 10xxxxxxx 10xxxxxxx 10xxxxxxx 10xxxxxxx 对应Unicode:0x04000000 - 0x7fffffff
UTF-8 特点是变长、多字节编码,所以可以兼容ASCII; 至此,编码的演变似乎告一段落
python 2中对于字符串的使用,最熟悉的应该是str,然而str的真实却是字节串,python 2中默认的编码方式ASCII;
>>> import sys >>> sys.getdefaultencoding() 'ascii' >>> test = 'test' >>> import chardet >>> chardet.detect(test) {'confidence': 1.0, 'language': '', 'encoding': 'ascii'}所以python源码开头处,都会声明文件的编码格式
# coding:utf-8而Unicode表示才是真正的字符串; basestring 中的 encode()和 decode() 方法就是用来转换字符和字节; 简而言之就是 字节 ——decode——> 字符 字节 <——encode—— 字符 而对于字节的encode以及字符的decode,在 python的str,unicode对象的encode和decode方法中有详细的解释
python3中的编码有待补充 # TODO
