python之编码

一、     编码相关概念

1、        ASCII

计算机内部都是由二进制值,字符集就是用一种对应关系来表示二进制与字符的映射关系。一个字节有8个bit,2**8就可以表示256个符号,当时,20世纪60年代,美国只用低7位制定了128个字符的ASCII字符集。

2、        非ASCII

Ø  从128到255被称为扩展ASCII字符集,不是国际标准。

Ø  中文的数字量大用双字节DBCSdouble-byte character set的方式进行表示,gb2312—gbk—gb18030

gb2313: 高字节 0xA1-0xF7   低字节  0xA1-0xFE

gbk:    高字节 0xA1-0xF7   低字节  0x00-0xFE

3、        Unicode

Ø  为了统一这种情况,将世界的所有符号都纳入其中,每个符号都有独一无二的编码,这就是Unicode。

Ø  由2个字节组成(UCS-2),后续扩展到4个字节(UCS-4)

Ø  UTF-8和Unicode 的关系:UTF-8是 Unicode 的实现方式之一,用于传输和存储(节省空间)。

Ø  在传输、存储使用UTF-8变长的,在内存中使用unicode固定长的。

Ø 中文unicode编码表:http://www.chi2ko.com/tool/CJK.htm

Ø  UTF-8编码规则:

1)      对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

2)      对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

Unicode符号范围     |       UTF-8编码方式

                (十六进制)           |      (二进制)

              ----------------------+---------------------------

                0000 0000-0000007F | 0xxxxxxx

                0000 0080-0000 07FF | 110xxxxx10xxxxxx

                0000 0800-0000 FFFF | 1110xxxx10xxxxxx 10xxxxxx

                0001 0000-0010 FFFF | 11110xxx10xxxxxx 10xxxxxx 10xxxxxx

                举个栗子:

                比如:张的unicode5F20  对应的二进制101111100100000

                格式:1110xxxx10xxxxxx 10xxxxxx

                二进制:101111100100000

                UTF-8:11100101 10111100 10100000

二、     python中的编码

1、        python2

Ø  python2默认的编码字符集是ASCII

Ø  python2中有两种字符序列的类型:str(字符串)和unicode(Unicode字符)

Ø  编码:unicode.encode() -> bytes(str)

解码:Bytes.decode -> unicode

2、        文件编码

why:

需要对文件进行编码然后由python解释器执行

how:

指定方式:文件头# coding=<encoding name>

                 -*- coding: <encodingname> -*-

                 vim: setfileencoding=<encoding name> :

3、        python解析器/分词器的工作逻辑:

Ø  读取文件

Ø  不同的文件,根据其声明的编码去解析为Unicode

Ø  转换为UTF-8字符串

Ø  针对UTF-8字符串,去分词

Ø  编译之,创建Unicode对象

摘自:https://www.python.org/dev/peps/pep-0263/

4、        指定系统默认编码(默认是ACSII)

why:

s = '中文'  # 注意这里的 str 是 str 类型的,而不是 unicode 
s.encode(“utf-8”) 

Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb18030。因为解码是python自动进行的,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下sys.defaultencoding 是 ASCII,如果 s 不是这个类型就会出错。我的 sys.defaultencoding 是 anscii,而 s 的编码方式和文件的编码方式一致,是 utf8 的,所以出错了: 

                       等价于 s.decode(“acsii”).encode(“utf-8”)

                       改成s.decode(“utf-8”).encode(“utf-8”)

how:

在文件头加入以下代码:

 # encoding=utf8

         import sys
         reload(sys)
         sys.setdefaultencoding(“utf-8”)
         or

                 在Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:
            #encoding=utf8 
            importsys
            reload(sys) 
            sys.setdefaultencoding('utf8') 

猜你喜欢

转载自blog.csdn.net/zt3032/article/details/80356043