您当前的位置:首页 > 互联网教程

python3.4 编码有哪些

发布时间:2025-05-13 23:03:01    发布人:远客网络

python3.4 编码有哪些

一、python3.4 编码有哪些

1、Python3中的编码问题前,第一个段落对字节、ASCII与Unicode与UTF-8等进行基本介绍,如果不对这几种编码犯头晕,可直接跳过。

2、首先从老大哥说起。跟很多人一样,大学读了这么久,久仰ASCII编码的大名。要说这个老大哥,我们再先从字节说起。一个字节包括八个比特位,每个比特位表示0或1,一个字节即可表示从00000000到11111111共2^8=256个数字。一个ASCII编码使用一个字节(除去字节的最高位作为作奇偶校验位),ASCII编码实际使用一个字节中的7个比特位来表示字符,共可表示2^7=128个字符。比如那时写C语言的程序,就经常要背下ASCII编码中的01000001(即十进制的65)表示字符‘A’,01000001加上32之后的01100001(即十进制的97)表示字符‘a’。现在打开Python,调用chr和ord函数,我们可以看到Python为我们对ASCII编码进行了转换。

3、第一个00000000表示空字符,因此ASCII编码实际上只包括了

4、字母、标点符号、特殊符号等共127个字符。因为ASCII是在美国出生的,对于由字母组成单词进而用单词表达的英文来说也是够了。但是中国人、日本人、

5、韩国人等其他语言的人不服了。中文是一个字一个字,ASCII编码用上了浑身解数256个字符都不够用。

6、因此后来出现了Unicode编码。Unicode编码通常由两个字节组成,共表示256*256个字符,即所谓的UCS-2。某些偏僻字还会用到四个字节,即所谓的UCS-4。也就是说Unicode标准也还在发展。但UCS-4出现的比较少,我们先记住:最原始的ASCII编码使用一个字节编码,但由于语言差异字符众多,人们用上了两个字节,出现了统一的、囊括多国语言的Unicode编码。

7、在Unicode中,原本ASCII中的127个字符只需在前面补一个全零的字节即可,比如前文谈到的字符‘a’:01100001,在Unicode中变成了00000000 01100001。不久,美国人不开心了,吃上了世界民族之林的大锅饭,原本只需一个字节就能传输的英文现在变成两个字节,非常浪费存储空间和传输速度。

8、人们再发挥聪明才智,于是出现了UTF-8编码。因为针对的是空间浪费问题,因此这种UTF-8编码是可变长短的,从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节。解决了空间问题,UTF-8编码还有一个神奇的附加功能,那就是兼容了老大哥的ASCII编码。一些老古董软件现在在UTF-8编码中可以继续工作。

9、注意除了英文字母相同,汉字在Unicode编码和UTF-8编码中通常是不同的。比如汉字的‘中’字在Unicode中是01001110

10、00101101,而在UTF-8编码中是11100100 10111000

11、我们祖国母亲自然也有自己的一套标准。那就是GB2312和GBK。当然现在挺少看到。通常都是直接使用UTF-8。记得我唯一一次看到GB编码的网页,是一个成人网站。

12、Python3中默认是UTF-8,我们通过以下代码:

13、Python3中字符编码经常会使用到decode和encode函数。特别是在抓取网页中,这两个函数用的熟练非常有好处。我的理解,encode的作用,使我们看到的直观的字符转换成计算机内的字节形式。decode刚好相反,把字节形式的字符转换成我们看的懂的、直观的、“人模人样”的形式。如下图。

14、\x表示后面是十六进制,\xe4\xb8\xad即是二进制的11100100 10111000

15、10101101。也就是说汉字‘中’encode成字节形式,是11100100 10111000

16、10101101。同理,我们拿11100100

17、10111000 10101101也就是\xe4\xb8\xad来decode回来,就是汉字‘中’。完整的应该是b'\xe4\xb8\xad',在Python3中,以字节形式表示的字符串则必须加上前缀b,也就是写成上文的b'xxxx'形式。

18、前文说的Python3的默认编码是UTF-8,所以我们可以看到,Python处理这些字符的时候是以UTF-8来处理的。因此从上图可以看到,就算我们通过encode('utf-8')特意把字符encode为UTF-8编码,出来的结果还是相同:b'\xe4\xb8\xad'。

19、明白了这一点,同时我们知道UTF-8兼容ASCII,我们可以猜想大学时经常背诵的‘A’对应ASCII中的65,在这里是不是也能正确的decode出来呢。十进制的65转换成十六进制是41,我们尝试下:

20、据说字符在计算机的内存中统一是以Unicode编码的。只有在字符要被写进文件、存进硬盘或者从服务器发送至客户端(例如网页前端的代码)时会变成utf-8。但其实我比较关心怎么把这些字符以Unicode的字节形式表现出来,露出它在内存中的庐山正面目的。这里有个照妖镜:

21、xxxx.encode/decode('unicode-escape')

22、b'\\u4e2d'还是b'\u4e2d,一个斜杠貌似没影响。同时可以发现在shell窗口中,直接输'\u4e2d'和输入b'\u4e2d'.decode('unicode-escape')是相同的,都会打印出汉字‘中’,反而是'\u4e2d'.decode('unicode-escape')会报错。说明说明Python3不仅支持Unicode,而且一个‘\uxxxx’格式的Unicode字符可被辨识且被等价于str类型。

23、如果我们知道一个Unicode字节码,怎么变成UTF-8的字节码呢。懂了以上这些,现在我们就有思路了,先decode,再encode。代码如下:

24、xxx.decode('unicode-escape').encode()

25、可以看到最后输出的UTF-8字节与上面的相同。尝试成功。所以其他的编码之间的转换,大概也是如此。

26、还记得刚刚那个ord吗。时代变迁,老大哥ASCII被人合并,但ord还是有用武之地。试试ord('中'),输出结果是20013。20013是什么呢,我们再试试hex(ord('中')),输出结果是'0x4e2d',也就是20013是我们在上文见面了无数次的x4e2d的十进制值。这里说下hex,是用来转换成十六进制的函数,学过单片机的人对hex肯定不会陌生。

27、最后的扩展,在网上看到的他人的问题。我们写下类似于'\u4e2d'的字符,Python3知道我们想表达什么。但是让Python读取某个文件的时候出现了'\u4e2d',是不是计算机就不认识它了呢?后来下文有人给出了答案。如下:

28、file= codecs.open("a.txt","r","unicode-escape")

二、怎么在Python里使用UTF-8编码

概述

在python代码即.py文件的头部声明即可

在python代码即.py文件的头部声明即可

Python默认脚本文件都是 ANSCII编码的,当文件中有非 ANSCII编码范围内的字符的时候就要使用"编码指示"来修正一个 module的定义中,如果.py文件中包含中文字符(严格的说是含有非anscii字符),则需要在第一行或第二行指定编码声明:

其他的编码如:gbk、gb2312也可以;否则会出现:

SyntaxError: Non-ASCII character'\xe4' in file test.py on line 3, but no encoding declared; see for details

先说一下python中的字符串类型,在python中有两种字符串类型,分别是 str和 unicode,他们都是basestring的派生类;

str类型是一个包含Characters represent(at least) 8-bit bytes的序列;

unicode的每个 unit是一个 unicode obj;

The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file.

也就是说在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或发送文字的应用中,优先采用的编码。

UTF-8使用一至六个字节为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节):

1、128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。

2、带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。

3、其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。

4、其他极少使用的Unicode辅助平面的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。

对上述提及的第四种字符而言,UTF-8使用四至六个字节来编码似乎太耗费资源了。但UTF-8对所有常用的字符都可以用三个字节表示,而且它的另一种选择,UTF-16编码,对前述的第四种字符同样需要四个字节来编码,所以要决定UTF-8或UTF-16哪种编码比较有效率,还要视所使用的字符的分布范围而定。不过,如果使用一些传统的压缩系统,比如DEFLATE,则这些不同编码系统间的的差异就变得微不足道了。若顾及传统压缩算法在压缩较短文字上的效果不大,可以考虑使用Unicode标准压缩格式(SCSU)。

互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。互联网邮件联盟(IMC)建议所有电子邮件软件都支持UTF-8编码。

三、Python中怎么定义中文编码

1、在python源码中如果使用了中文字符,运行时会有错误,解决的办法是在源码的开头部分加入字符编码的声明,下面是一个例子:

2、Python Tutorial中指出,python的源文件可以编码ASCII以外的字符集,最好的做法是在#!行后面用一个特殊的注释行来定义字符集:

3、根据这个声明,Python会尝试将文件中的字符编码转为encoding编码,并且,它尽可能的将指定地编码直接写成Unicode文本。

4、注意,coding:encoding只是告诉Python文件使用了encoding格式的编码,但是编辑器可能会以自己的方式存储.py文件,因此最后文件保存的时候还需要编码中选指定的ecoding才行。

5、u'\xd6\xd0\xce\xc4'

6、'\xd6\xd0\xce\xc4'

7、u"中文"只是声明unicode,实际的编码并没有变。这样子就发生变化了:

8、'\xd6\xd0\xce\xc4'

9、>>> str= str.decode("gb2312")

10、u'\u4e2d\u6587'

11、>>> s.decode('gb2312')

12、u'\u4e2d\u6587'

13、>>> len(s.decode('gb2312'))

14、>>> s= u'中文'

15、>>> s='中文test'

16、>>> len(s.decode('gb2312'))

17、>>> s='中文test,'

18、>>> len(s.decode('gb2312'))

19、可以看出,对于实际Non-ASCII编码存储的字符串,python可以正确的识别出其中的中文字符以及中文上下文中的标点符号。

20、前缀“u”表示“后面这个字符串“是一个Unicode字符串”,这仅仅是一个声明,并不表示这个字符串就真的是Unicode了;就好比某正太声称自己已满18岁,但实际上他的真实年龄并不确定,现在体育界年龄造假可不稀罕幺!

21、那么声明成u有什么作用呢?对于Python来说,只要你声明某字符串是Unicode,它就会用Unicode的一套机制对它进行处理。比方说,做字符串操作的时候会动用到内部的Unicode处理函数,保存的时候以Unicode字符(双字节)进行保存。等等。显而易见,对于一个实际上并不是 Unicode的字符串,做Unicode动作的处理,是有可能会出问题的。 u前缀只适用于你的字符串常量真的是Unicode的情况。