Python字符编码的几个问题

来源:互联网 发布:vivo手机一键锁屏软件 编辑:程序博客网 时间:2024/06/05 12:48

几种字符编码方式

ASCII——ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

Unicode——ASCII码最多只能处理256个字符,这对英文是够用了,但是对于其他语言就不够了,比如中文,汉字多大10万左右,就无法用ASCII来表示了。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。

UTF8——随着互联网的发展,同时又为了减少存储空间,UTF-8就成了在互联网上使用最广的一种Unicode的实现方式。**注意,UTF-8是Unicode的实现方式之一,还有UTF-16,UTF-32。**UTF-8描述了字符在计算机内的具体存储方式。具体实现规则可以在网上查。

Python字符

python 3中,字符默认采用Unicode编码,str函数获得的字符串都是Unicode编码字符。将字符转换成另一种二进制存储方式,称之为编码,可以采用encode()函数,反过来则为解码,采用decode()函数。

>>> s = 'café'>>> len(s)4>>> b = s.encode('utf-8')>>> len(b)5>>> bb'caf\xc3\xa9'>>> b.decode('utf-8')'café'>>> 

上面的例子中,s有4个Unicode字符,b就是s采用utf-8编码后的字节码,它包含5个字节,其中é编码成了两个字节。同时将这些字节码用utf-8编码方式解码后得到了原来的字符串。

常见的encode和decode问题

UnicodeEncodeError

许多非UTF字符编码器仅仅只包含了Unicode字符的一个子集,当将文本转换成字节码时,如果遇到了一个字符没有定义在这个子集中,就会出现UnicodeEncodeError错误。举例如下:

>>> city = 'São Paulo'>>> city.encode('utf-8')b'S\xc3\xa3o Paulo'>>> city.encode('utf-16')b'\xff\xfeS\x00\xe3\x00o\x00 \x00P\x00a\x00u\x00l\x00o\x00'>>> city.encode('cp437')Traceback (most recent call last):  File "<pyshell#9>", line 1, in <module>city.encode('cp437')  File "C:\Python34\lib\encodings\cp437.py", line 12, in encodereturn codecs.charmap_encode(input,errors,encoding_map)UnicodeEncodeError: 'charmap' codec can't encode character '\xe3' in position 1: character maps to <undefined>

如果不想让它抛出异常,可以如下处理:

>>> city.encode('cp437', errors='ignore')b'So Paulo'>>> city.encode('cp437', errors='replace')b'S?o Paulo'>>> city.encode('cp437', errors='xmlcharrefreplace')b'S&#227;o Paulo'

其中ignore调过不能处理的字符,replace用‘?’替代不能处理的字符,xmlcharrefreplace则用XML实例替换不能处理的字符。

UnicodeDecodeError

由于不是每一个字节序列都代表了一个有效的UTF-8或者UTF-16字符编码,因此当从一个二进制序列解码到文本时,可能就会产生UnicodeDecodeError异常。像 ‘cp1252’, ‘iso8859_1’, ‘koi8_r’能够解码任何字节序列,包括噪声在内,即便是错误的编码,它们也不会报异常。

octets = b'Montr\xe9al'>>> octets.decode('cp1252')'Montréal'>>> octets.decode('iso8859_7')'Montrιal'>>> octets.decode('koi8_r')'MontrИal'>>> octets.decode('utf_8')Traceback (most recent call last):  File "<pyshell#47>", line 1, in <module>octets.decode('utf_8')UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 5: invalid continuation byte>>> octets.decode('utf_8', errors='replace')'Montr�al'

SyntaxError

python 3中源码默认的编码方式为UTF-8编码,如果一个源码文件不是以UTF-8编码的,那么在加载的时候,可能就会报SyntaxError。

0 0
原创粉丝点击