Python字符编码整理

字符编码整理

编码问题一直是pythoner绕不过去的坎儿,这里记录下自己思考的内容,仅作参考

网上关于这方面的文章已经有很多,这里列举几篇参考的博文
Python字符编码详解
Unicode和Python的中文处理
python的str,unicode对象的encode和decode方法
python encode和decode函数说明

1、起因


用于显示的字符集需要唯一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的实现方式之一

2、 UTF-8


关于 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;
至此,编码的演变似乎告一段落

3、Python 2中的编码


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方法中有详细的解释

Python 3中的编码


python3中的编码有待补充 # TODO

你可能感兴趣的:(Python)