在Python中没有所谓的字符(character)数据,如果字符串含一个字符,我们称这是含一个字符的字符串。
计算器内部最小的存储单位是 位 (bit),这个 位 只能存储0或1。一个英文字符在计算器中是被存储成8个位的一连串0或1中,存储这个英文字符的编码称为ASCII(American Standard Code for Information Interchange,美国信息交换标准程序代码),有关ASCII码的内容可以参考附录E。
在这个ASCII表中由于是用8位定义一个字符,所以使用了0~127定义了128个字符,在这128个字符中有33个字符是无法显示的控制字符,其他则是可以显示的字符。不过有一些应用程序扩充了功能,让部分控制字符可以显示,例如,扑克牌花色、笑脸等。至于其他可显示字符有一些符号,例如+、-、=、0~9、A~Z或a~z等。这些符号每一个都有一个编码,我们称这个编码是ASCII码。
可以使用下列函数执行数据的转换。
chr( x ) :返回函数x值的ASCII或Unicode字符。
例如,从ASCII表可知,字符a的ASCII码值是97,可以使用下列方式打印出此字符。
英文小写与英文大写的码值相差32,可参考下列实例。
计算机是美国发明的,因此ASCII码对于英语系国家的确很好用,但是地球是一个多种族的社会,存在几百种语言与文字,ASCII所能容纳的字符是有限的,只要随便一个不同语系的外来词,例如 ,含重音字符就无法显示了,更何况有几万中文字或其他语系文字。为了让全球语系的用户可以彼此用计算机沟通,因此有了Unicode码。
Unicode码的基本精神是,世上所有的文字都有一个码值,可以参考下列网页:
http://www.unicode.org/charts
目前,Unicode内定义了超过11万的文字,它的定义方式是以“\u”开头后面有4个十六进制的数字,所以是从“\u0000”至“\uFFFF”。在上述网页中可以看到不同语系表,其中,East Asian Scripts字段可以看到 CJK ( C hinese, J apanese, K orean),在这里可以看到汉字的Unicode码值表,CJK统一汉字的编码为4E00~9FBB。
在Unicode编码中,前128个码值是保留给ASCII码使用,所以对于原先存在ASCII码中的英文大小写、标点符号等,是可以正常在Unicode码中使用的,Unicode编码中经常用的是ord( )函数。
ord( x ) :可以返回函数字符参数x的Unicode码值,如果是中文字也可返回Unicode码值。如果是英文字符,Unicode码值与ASCII码值是一样的。有了这个函数,可以很轻易地获得字符的Unicode码值。
程序实例ch3_23.py: 这个程序首先会将整数97转换成英文字符‘a’,然后将字符‘a’转换成Unicode码值,最后将中文字‘魁’转成Unicode码值。
执行结果
utf-8是针对Unicode字符集的可变长度编码方式,这是Internet目前所遵循的编码方式,在这种编码方式下,utf-8使用1~4个byte表示一个字符,这种编码方式会根据不同的字符变化编码长度。
ASCII使用utf-8编码规则
对于ASCII字符而言,基本上它使用1个byte存储ASCII字符,utf-8的编码方式是byte的第一个位是0,其他7个位则是此字符的ASCII码值。
中文字的utf-8编码规则
对于需要n个byte编码的Unicode汉字字符而言,例如需要3个byte编码的汉字,第一个byte的前n(3)位皆设为1,n+1(4)设为0。后面第2和第3个byte的前2位是10,其他没有说明的二进制全部是此汉字字符的Unicode码。依照此规则,可以得到汉字的utf-8编码规则如下:
1110xxxx 10xxxxxx 10xxxxxx # xx就是要填入的Unicode码
例如,从ch3_23.py的执行结果可知“魁”的Unicode码值是0x9b41,如果转成二进制方式则如下所示:
10011011 01000001
我们可以用下列更细的方式,将“魁”的Unicode码值填入xx内。
从上图可以得到“魁”的utf-8编码结果是0xe9ad81,3-6-1节的实例2也可以验证这个结果。