本文参考廖雪峰老师的Pyhton教程
几种编码
ASCII
计算机只能处理0和1,所有的文本都要转换成数字才能处理。早期计算机在设计时采用8个比特(bit)为一个字节,计算机是由美国人发明的,他们将26个字母、数字和一些符号编码到计算机中。一个字节(8位)表示,最多能表示128种字符,称为ASCII码。
Unicode
非英语国家只能规定适用自己语言的编码,如中国制定了GB2312
编码,日本制定了Shift_JIS
编码,韩国制定了Euc-kr
编码。如此以来,各国执行不同的标准,如果文本同时出现多种语言,则无法正常显示,会有乱码。
所以Unicode应运而生,它把所有语言都统一到一套编码里,这样就不会出现显示乱码问题了。
上面说到,ASCII采用1个字节编码,Unicode通常采用2个字节编码,所以最大能表示65536种字符。
字母A
用ASCII码表示是十进制的65
,二进制中是`0100 0001
字符0
用ASCII码表示是十进制的48
,二进制中是0011 0000
。注意,字符0
和整数0
是不同的。字符用ASCII码表示只占一个字节,十进制为48
,整数0在c语言中占2个字节 ,十进制为0
。
汉字中
已经超出了ASCII码的范围,在Unicode中,十进制表示为20013
,二进制为01001110 00101101
那么字符A
在Unicode中怎么表示呢?
直接在其ASCII码的二进制表示前加0即可,即00000000 01000001
UTF-8
采用Unicode统一编码的方式,解决了多语言冲突显示乱码的问题,但是
Unicode有一个问题,如果我写的文本基本为英文的话,采用unicode编码的话,该文件所占用的内存空间比采用ASCII编码多一倍,在存储和传输上就极不划算。
由此,人们想出了把Unicode编码转换成“可变长编码”的UTF-8
编码,UTF-8编码把Unicode中的字符按不同的数字大小编码成1-6个字节,英文通常为1个字节,汉字通常为3个字节,只有极其生僻的字符才可能用到4-6个字节。如果要传输的文本以英文为主,则采用UTF-8编码能节省大量的存储空间。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 0110 0001 | 00000000 01100001 | 0110 0001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
从上面表格还可以发现,UTF-8已经将ASCII码包含进来了,所以一些历史遗留的只支持ASCII码的软件可以在UTF-8下继续使用。
ps: 以前也看过这几个编码,勉强知道个大概意思,但很难理解,直到看到廖老师的教程,感觉突然间豁然开朗。