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') 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zt3032/article/details/80356043
个人分类: python
想对作者说点什么? 我来说一句

python 弓形编码

2012年12月31日 1KB 下载

python 文件读写 乱码

2011年02月16日 2KB 下载

python chardet2.0.1

2012年08月31日 168KB 下载

Python 中文乱码问题深入分析

2014年08月25日 345KB 下载

没有更多推荐了,返回首页

不良信息举报

python之编码

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭