本文仅供个人记录和复习,不用于其他用途
字符编码
ASCII码
学过C语言等高级编程语言,我们对于字符串肯定不陌生。事实上,何止是不陌生,简直是对其深恶痛绝。C++和Java对字符串做了包装,用起来要方便一点。然而,C语言的字符串可是最原始的,用起来那叫一个伤脑筋。
说到字符串,肯定要先说说ASCII
编码。计算机要将文本转换为数字,才能够进行处理,而C语言的char
类型是1个字节,ASCII码所包含的文本量也是1个字节,也就对应了英文中的字母以及各种符号。
不过,中文、韩文等字符就不行了。拿中文做比方,一般的中文字要用到2个字节。比如我们用C语言编写如下代码:
|
|
这么做你肯定会得到一个乱码,因为中文字是两个字节,光打印一个是没用的,你得在这么做:
|
|
这个其实也就相当于printf(“%s”, str)
,所以ASCII码对于英文以外的字是没法处理的。
Unicode码
为了不和ASCII码冲突,中文制定了GB2312
码,而日文、韩文也制定了相应的编码。但是呢,如果存在多语言混合的文本,那么显然就会出现乱码的情况。为了防止这种情况出现,Unicode码诞生了。
Unicode码用于存储所有语言,一般来说是两个字节,如果有很偏僻的字那就是4个字节。比如汉字中
,用Unicode码表示就是20013
,二进制就是01001110 00101101
。对于原来存在于ASCII码中的字符,我们只需要补位即可。例如A
用Unicode编码,那么就是在它的前面补零即可,也就是00000000 01000001
UTF-8码
当然,如果你写的文本全是英文,那么Unicode码会浪费大量的空间。因此,为了节省,Unicode码又转变成了UTF-8
编码。UTF-8码可以根据文本字符不同的大小,分成1-6个字节,英文字母一般分为1个字节,而汉字一般是3个字节,生僻字分为4-6个字节。另外,哪怕是只支持ASCII编码的软件,也能够在Unicode码下继续工作。
字符编码工作方式
计算机内存中统一使用Unicode编码,而需要传输和保存时转换成UTF-8编码。用记事本编辑时,从文件读取UTF-8字符,然后转换成Unicode字符存到内存里。编辑完成并保存时,再把Unicode转换成UTF-8。
字符串
最早的Python只支持ASCII码,可以使用ord()和chr()函数,对字符和数字进行转换:
>>> ord('H')
>>> chr(72)
72
'H'
Python在支持了Unicode之后,对于Unicode字符用u’’
表示:
>>> print u'我爱中国'
>>> u'中'
我爱中国
u'\u6211\u7231\u4e2d\u56fd'
对于ASCII码和Unicode码的转换,Python中可以使用encode(‘’)
方法:
>>> u'ABC'.encode('utf-8')
>>> u'中文'.encode('utf-8')
'ABC'
'\xe4\xb8\xad\xe6\x96\x87'
ASCII码可以看做是UTF-8码,使用encode(‘utf-8’)
转换得到的就是UTF-8码。我们可以看到,英文转换后UTF-8和Unicode是一样的,但是中文转换之后,一个Unicode字符变成了三个UTF-8字符。比如\xe4
就是一个字节,是用十六进制表示的。我们用len()
方法来查看一下字符串长度:
>>> len(u'ABC')
>>> len('ABC')
>>> len(u'中文')
>>> len('\xe4\xb8\xad\xe6\x96\x87')
3
3
2
6
那么如果要反过来转换,可以使用decode(‘utf-8’)
方法:
>>> 'ABC'.decode('utf-8')
>>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
>>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'ABC'
u'\u4e2d\u6587'
中文
注意,在编写Python代码时,如果有中文,务必将文本文件的编码格式指定为UTF-8。如果想要Python解释器按照UTF-8来解析代码,那么就要加上这两行注释:
|
|
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释。而第二行则告诉解释器按照UTF-8的格式来读取文件。另外,如果你是用的是Notepad++或者其他文本编辑器,记得调成UTF-8的格式。