|
|
计算机只认识0和1的比特流,一个字节有8个比特位。
那一个字节能表示00000000-11111111之间的一个数字,变成10进制就是0-255,变成16进制就是00-FF,总共能表示256个字符。
我们要对字符编码,就必须要有一个字符集,在这个字符集中定义了每一个字符对应的字节。
比如大写字母A,我们定义用16进制的41表示,那么转换成2进制,就是01000001。那计算机碰到一个字节是01000001的话,它就会解码成对应的字符。
美国就制定了这样一个字符集,用一个字节表示字符,叫做ascaii字符集。但是这样的话,最多也只能表示256个字符,后来就扩展可以使用2个字节编码,这样能表示更多的字符。
当然扩展成2个字节编码还是要兼容原来的ascaii字符集的,比如我们的GBK字符集就定义如果遇到一个字节大于127,那么这个字节和后面一个字节共同表示一个字符;如果第一个自己小于127,那么这个字节就单独表示一个字符,就是ascaii中定义的相关字符。这一类从ascaii字符集扩展出来的字符集,我们统称其编码方式为ANSI编码。采用ANSI编码,需要一个或两个字节表示一个字符。
Unicode编码能表示更多的字符,范围从00000-10FFFF,但是我们不能就这样直接表示一个字符,因为计算机不知道这个字符是从哪个字节开始哪个字节结束的,所以必须加上控制位,然后就出现了utf-8,utf-16,utf-32等各种unicode编码。
GB18030的问题在于有6000多个字符是四个字节表示的,并且这个字符集还要兼容GBK和GB3212,GBK和GB3212是ANSI编码,而ANSI编码是一个或两个字节表示一个字符的。但是GB18030是中国制定的字符集标准,销售到中国的产品必须要支持,微软就采用了一种特别的方式来识别GB18030字符集。但是这种不伦不类的字符集,实在是鸡肋,有四个字节的字符,不能用unicode编码,因为要兼容ANSI编码的字符集,微软只能费点时间来实现,表示我的产品是支持这个字符集的,就可以在中国卖了,实际没什么人使用,兼容性太差。
[ 本帖最后由 racingstar 于 2010-8-12 19:53 编辑 ] |
|