打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
专业在线电子书网站

10.1 什么是字符编码

如果你已经使用Python编程了一段时间,就会发现Python的字符编码真是一件令人头痛的事情。

特别是当程序在运行的时候,突然冒出一个错误:

ValueError:Expected a bytes object,not a unicode object

或者在使用print打印结果的时候,突然冒出一个错误:

UnicodeDecodeError:'cp950'codec can't decode byte 0x96 in position 10:illegal multibyte sequence

这时,你可能马上使用百度或谷歌搜索解决方法,但是根据网上的方法即使解决了错误,但是很可能不知道为什么这个方法能够解决这个错误。这也是笔者之前经常遇到的问题,接下来就为读者介绍这些错误为什么发生,并提供解决方案,让你不再有此烦恼。

首先,从字符串编码说起,无论是Python 2还是Python 3,总体上说,字符串的编码只有两大类:

(1)通用的Unicode编码。

(2)将Unicode转化成的某种类型的编码,如UTF-8、GBK等。

介绍Unicode编码前,先来了解计算机编程的历史。

由于计算机只能处理数字,因此处理文本时必须先转换为数字才行。最早的计算机在设计时采用8比特(bit)作为一个字节(byte),而计算机采用二进制,所以一个字节可以表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

美国人发明了计算机,同时制定了编码,以对应英文字符和二进制数字之间的关系。这种编码被称为ASCII码。ASCII码一共规定了128个字符的编码,比如大写字母A是65、二进制为01000001。

其实,这128个字符表示英文绰绰有余,但是中文有超过10万个汉字,一个字节只能表示256种符号,显然是不够的。所以,中国使用GB2312作为简体中文常见的编码方式,两个字节表示一个汉字,理论上最多可以表示256×256=65536个符号。除了中国以外,其他国家也纷纷制定了自己的编码来表示本国的文字,如日文用的是Shift_JIS。这样造成的结果是,同一个字符可能会在不同国家/地区的编码体系中代表不一样的文字。例如,130在法语编码中代表é,在希伯来语编码中却代表字母

。因此,在多语言的文本中可能会出现乱码。

为了让各国/地区能够跨语言、跨平台进行文本转换与处理,Unicode被创造了出来。

Unicode被称为统一码、万国码或单一码。也就是说,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,大概包含100多万个符号。

Unicode和ASCII的区别是什么呢?Unicode编码通常是两个字节,而ASCII是一个字节。例如,字母A的ASCII编码为01000001,Unicode编码为0000000001000001,其实英文字母ASCII编码转成Unicode编码就是在前面加0。

既然Unicode已经包含所有符号了,为什么Unicode还会被编码呢?

因为在ASCII中,英文字母只用一个字节表示就够了,但是用Unicode编码写英文的每个符号用两个字节,因此要将其中一个字节全部用0表示。这样存储造成极大的浪费,比ASCII多了一倍的存储空间。

为了节省空间,开发了一些中间格式的字符集,被称为通用转换格式Unicode Transformation Format(UTF),常见的有UTF-8和UTF-16。

随着互联网的普及,强烈要求出现一种统一的编码方式,UTF-8就是在互联网上使用最广的一种Unicode的实现方式。UTF-8最大的一个特点是长度可变,它可以使用1~4个字节表示一个符号,英文字母通常被编为1个字节,汉字通常被编为3个字节,如表10-1所示。

表10-1 英文字母A和汉字中的编码对照

对于UTF-8编码,怎么知道什么时候是1个字节,什么时候是3个字节呢?

其实,UTF-8的编码规则很简单,只有两条:

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

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

例如,上述字符A为单字节符号,其UTF-8编码字节的第1位是0。而汉字“中”为3个字节符号:第1个字节的前3位都设为1,第1个字节的第4位为0,后面字节的前两位全为10。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ASCII,Unicode和UTF-8
常见字符编码辨析
UTF
ANSI、ASCII、Unicode和UTF
Python字符编码
java中文乱码解决之道—
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服