本周遇到了文字编码的问题,其实之前做IME的时候已经有一些积累了,但没有写下来,这次做个小结。
首先说说ASCII码吧,计算机在外国诞生后,大家要想怎么吧characters input给计算机,他们就定了ASCII,现在有人抱怨老美太小气,只设计了128个,其实不然。试想想当时的环境,一是他们无法预料计算机能像现在这样普及,二是存储设备还都不成熟,成本爆高。所以导致后来的局面,也就是ISO和unicode两种字符集,分别是UCS-4(4个字节)和unicode 1.0(2个字节),但这种定长的导致英语国家不答应了,平时字符都是一个byte,现在突然编程2个甚至是4个,还有后来加入新的字符后就更乱了,最后两个组织整合了,整个世界终于安静了。
在这我想澄清个概念,就是大家不要把unicode和utf-8, utf-16, utf-32搞乱了,首先unicode是一套标准的字符集,基本包括了大多数的文字了,可以在这个路径下载最新的字符表http://www.unicode.org/ ,utf-7,8等都是基于这个字符集的一些编码算法。在unicode设计的时候把ASCII码的128个作为unicode的前128个。那么现在最最最流行的也就是UTF-8的编码了,它的算法思想是:
U-00000000 - U-0000007F: 0xxxxxxx ASCII码
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
比如我在codeCharts里面找到这个字符Ď(010e),那么它的UTF-8结果是:
1 0000 1110 -------> 110 00 100 10 001110 C48E 就这么简单了,有没有。
这里我还想引入一个库libiconv,可以说是一个万能的转换编码的工具把,去网站http://www.gnu.org/software/libiconv/ 了解详情,它目前支持的字符编码不下30种,常用的都有了。那么有了这个库以后呢,大家可以在遇到已知输入多种编码时,可以用它来转成一种类型的编码(utf-8),然后做处理。VCard的解析我就是就是这样解决的。
先到这,希望各位博友能再补充,提点一二,万分感谢!