全球化编码

从C\C++\开始学编程的兄弟们肯定对char这个基本类型有深刻的理解。什么\0最为结束符,strlen和sizeof,字符串数组和char*的字符串,这部分基本上是学习C语言最先要面对的一个拦路虎。当然学习java、C#这些相对没有历史包袱的语言的时候,就不会感到这么坑爹了。

实际上,对不起各位的是,char这个类型作为描述字符的载体,还有着其他的问题。我们在下面简单说一些。(仅作为抛砖引玉,如果有什么缺陷,希望大家不吝赐教)

  1. 对于老美来说,char很完美。从char这个类型来说,在C\C++的标准中,它占用8位,也就是最多支持256个字符,除去一个结束符,最多也就支持255个。C\C++这群人在一开始的时候,255个足够老美用了,就愉快的决定义了字符和一些制表符在char里面的表现方式。这就是ASCII。这里我多说一句,ASCII是一种编码格式,他表示的是一个码表(code set)在计算机里面的表现方法。我们要区分清楚码表和编码这两者的区别。
  2. 对象形语系来说,char不够用。当C\C++出海了之后,到了亚洲国家,人们就发现用char表示这么多汉字,根本就是强人所难。所以当时主要是中国、日本、韩国,各自定义了自己的码表和编码,基本上都是用更多的char来表示更多的字。比如说“啊”,在GB2312中,就用0xB0(第一个字节) 0xA1(第二个字节)储存。并且前0x00~0xFF与ASCII兼容。
  3. 对于不同的拉丁语系来说,char也很蛋疼。对于有重音的拉丁语系,例如à,它就需要占用ASCII表中128--255的部分。那么同样的是char,同样的值,对应不同的拉丁语码表的时候,可能就会出现不同的结果。
  4. 对于象形语系来说,更加蛋疼。比如中国的“啊”再GB2312下是0xB0、0xA1,那么到了GBK下面,可能就是其他的字,因为GBK和GB2312的码表和编码都不一样。

后来,大家发现了这个问题,对于一个程序,想要全球发布,就会面临很大的问题。所以后来人们就发明了另外一种码表-Unicode。顾名思义,Unicode是把世界上所有的字符,都包含进来的一个超级大的码表。Unicode的基本思想就是,我的表里面什么都有,无论在任何语言的任何系统,只要支持Unicode,就能在表里面找到想要的字符。当前Unicode使用的是UCS-2(16位的),可以容纳65535个字符,基本上也够用了。编码方式有utf-16、utf-32、utf-8。因为utf-8对之前的一些字符串函数兼容性更好,所以现在广泛使用的就是utf-8。

 

好了,到现在为止,我们一共提出了ASCII、亚洲的多字符编码、Unicode三种大的编码方式。那我们要怎么选择,以及他们相互之间要怎么切换哪?等我有时间再说。

posted @ 2017-05-11 00:12  KKKEr  阅读(382)  评论(0编辑  收藏  举报