爬虫与Python:(二)Python基础篇——6.编码

字符串也是一种数据类型,但是字符串比较特殊的还是编码问题。因为计算机只能处理数字,如果要处理文本,就必须吧文本转化为数字。最早计算机在设计时采用了8个比特(bit)作为字节(Byte),所以,一个字节能表示的最大整数是255(二进制11111111 = 十进制255),如果表示更大整数,就必须用更多的自己。例如,两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。

由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机中,也就是大小写的英文字母、数字和一些符号,这个编码被称为ASCII编码。例如,大写字母A的编码时65,小写字母z的编码时122。

但是,要处理中文一个字节显然是不够,至少需要两个字符,而且还不能和ASCII编码冲突,所以,中国指定了GB2312编码,用来把中文编进去。

全世界有上百种语言,日本把日文编到Shift_JIS中,韩国把韩文编到EUC-KR中,各国有各国的标准,就不可避免的出现冲突,结果就是,在多种语言混合的文本中,显示出来会乱码。

因此,Unicode应用而生。Unicode把所有语言都统一到一套编码中,这样就不会在有乱码问题了。Unicode标准也在不断发展,但最常用的是两个字节表示一个字符(如果要用到非常陪陪的字符,需要个字节)。现代操作系统和大多数语言都支持Unicode。

ASCII编码和Unicode编码的区别是:ASCII编码时一个字节,而Unicode编码通常是两个字节,举例如下:

  1. 字母A用ASCII编码时十进制65,二进制的01000001。
  2. 字符0用ASCII编码时十进制的48,二进制的00110000。需要注意的是,字符‘0’和0是不同的。
  3. 汉字中移除处理ASCII编码的范围,用Unicode编码时十进制的20013,二进制的0100111000101101。

可以猜测,如果把ASCII编码的A用于Unicode编码,只需要在前面补0就可以,因此A的Unicode编码时00000000 010000001。

新的问题又出现了:如果同意用Unicode编码,乱码问题就消失了。但是,如果文本基本全是英文,那么Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,为了节省空间,又出现了将Unicode编码转化为“可变长编码”的UTF-8。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1~6个字节,常用英文字母被编码成一个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4~6个字节。如果需要传输的文本包含大量的英文字符,用UTF-8编码就能节省很多控件。如表1-3所示:

编码对比表
字符 ASCII Unicode UTF-8
A 010000001 00000000 010000001 010000001
× 0100110 00101101 11100100 10111000 10101101

从山表可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量支持ASCII编码的软件就可以在UTF-8编码下继续工作。

总结

清楚了ASCII、Unicode和UTF-8的关系,就可以总结一下现代计算机系统通用的字符串编码工作方式:在计算机内存中统一使用Unicode编码,当需要保存到硬盘或需要传输时,就转换为UTF-8编码。用记事本编辑时,从文件读取的UTF-8字符转换为Unicode字符串保存到内存中,编辑完成后,保存是再把字符串转换为UTF-8字符保存到文件中。

posted @ 2021-10-07 18:05  陆陆无为而治者  阅读(102)  评论(0编辑  收藏  举报