在Python中没有所谓的字符(character)数据,如果字符串含一个字符,我们称这是含一个字符的字符串。
ASCII码
计算器内部最小的存储单位是 位 (bit),这个位只能存储 0 或 1 。一个英文字符在计算器中是被存储成8个位的一连串0或1中,存储这个英文字符的编码我们称 ASCII (American Standard Code for Information Interchange,美国信息交换标准程序代码),有关ASCII码的内容可以扫码查看。
这个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所能容纳的字符是有限的,只要随便一个不同语系的外来词,例如:café,含重音字符就无法显示了,更何况有几万中文字或其他语系文字。为了让全球语系的用户可以彼此用计算机沟通,因此有了Unicode码的设计。
Unicode码的基本精神是,所有的文字皆有一个码值,我们也可以将Unicode想成是一个字符集。
目前Unicode使用16位定义文字,2 16 等于65536,相当于定义了65536个字符,它的定义方式是以\u开头后面有4个十六进制的数字,所以是从\u0000至\uFFFF。不同语系表中的East Asian Scripts字段可以看到 CJK ,这是Chinese、Japanese与Korean的缩写,在这里可以看到汉字的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字符集的 可变长度编码方式 ,这是因特网目前所遵循的编码方式,在这种编码方式下,utf-8使用1~4个字节表示一个字符,这种编码方式会根据不同的字符变化编码长度。
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。