主要内容
- 历史来源
- 通用规则
下面开始瞎掰
历史来源
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
;全球还有那么多国家……; 多个语言混合,就是乱码!
然后电脑受不了了!!!!!!!!
然后 所有语言都统一到一套编码里,就是 Unicode
。 Unicode
标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要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保存到文件