字符编码

主要内容

  • 历史来源
  • 通用规则

下面开始瞎掰

历史来源

ASCII Unicode UTF-8 …… 字符编码真是一个让人头疼的事情。

最早 的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(2的8次方-1),如果要表示更大的整数,就必须用更多的字节。
比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。由于电脑是米国发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,

然后 这个编码表被称为 ASCII 编码,比如大写字母A的编码是65,小写字母z的编码是122。

处理中文显然一个字节不够,至少需要2个字节,还不能和 ASCII 冲突,
然后 中国就有了 GBK GB2312;岛国有了 Shift_JIS;斯密达有了 Euc-kr;全球还有那么多国家……; 多个语言混合,就是乱码!

然后电脑受不了了!!!!!!!!
然后 所有语言都统一到一套编码里,就是 UnicodeUnicode 标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。

这里有个例子:

字符 ASCII Unicode
A 01000001 00000000 01000001
x 01001110 00101101

smart的大家都看出来: ASCII编码的A用Unicode编码,只需要在前面补0就可以。统一成Unicode编码,乱码问题从此消失了。

然后网络和硬盘来抗议了,看看如果全英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间!而且电脑语言基本都是英文。
然后 UTF-8 (8-bit Unicode Transformation Format) 就诞生了,其实就是Unicode编码转化为“可变长编码”的编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果要传输的文本包含大量英文字符,用UTF-8编码就能节省空间

这里还是有个例子:

字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
x 01001110 00101101 11100100 10111000 10101101

smart的大家都看出来:ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

通用规则

  • 内存中,统一使用Unicode编码,
  • 保存到硬盘或者传输的时候,就转换为UTF-8编码。

这里依然是个例子:
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件