攀升·Uranus


Something Different,Something New
数据加载中……

小谈字符编码-unicode & utf-8

 

        本周遇到了文字编码的问题,其实之前做IME的时候已经有一些积累了,但没有写下来,这次做个小结。

        首先说说ASCII码吧,计算机在外国诞生后,大家要想怎么吧characters input给计算机,他们就定了ASCII,现在有人抱怨老美太小气,只设计了128个,其实不然。试想想当时的环境,一是他们无法预料计算机能像现在这样普及,二是存储设备还都不成熟,成本爆高。所以导致后来的局面,也就是ISOunicode两种字符集,分别是UCS-4(4个字节)unicode 1.0(2个字节),但这种定长的导致英语国家不答应了,平时字符都是一个byte,现在突然编程2个甚至是4个,还有后来加入新的字符后就更乱了,最后两个组织整合了,整个世界终于安静了。

        在这我想澄清个概念,就是大家不要把unicodeutf8 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的解析我就是就是这样解决的。

        先到这,希望各位博友能再补充,提点一二,万分感谢!

 

posted on 2009-03-01 11:01 攀升 阅读(1699) 评论(1)  编辑 收藏 引用 所属分类: Others

评论

# re: 小谈字符编码-unicode & utf-8  回复  更多评论   

大致讲到点子上去了,不错,又进步~~
看来没有白教你呀!
2009-03-02 23:17 | Cindy

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理