Unicode和UTF-8

一.各地的方言

首先说明一下现在常用的一些编码方案:
在中国,大陆最常用的就是 GBK18030 编码,除此之外还有 GBK , GB2312 ,这几个编码的关系是这样的。

  • 最早制定的汉字编码是 GB2312 ,包括 6763 个汉字和 682 个其它符号。
  • 95 年重新修订了编码,命名 GBK1.0 ,共收录了 21886 个符号。
  • 之后又推出了 GBK18030 编码,共收录了 27484 个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在 WINDOWS 平台必需要支持 GBK18030 编码。

按照 GBK18030 、 GBK 、 GB2312 的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
2.台湾,香港等地使用的是 BIG5 编码
3.日本: SJIS 编码

Read the rest of this entry »

Tags: ,

使用linux的时候一直会碰到一些乱码问题,因为用着GUI,所以也没有去了解过关于字符编码的一些知识。今天在bash删除一个乱码文件,于是乎又想到了字符编码,google了一翻,找到一篇文章,贴出其中的一部分:

ASCII是用来表示英文的一种编码规范,表示的最大字符数为256个,每个字符占1个字节。如果只用来表示英文应该是绰绰有余了,可是还要表示中文、阿拉伯文所以就有很大的不足了,于是就产生了GB2312。很多人应该对这个比较了解,很多国内网页指定的编码都是GB2312的,它其实是对ASCII的一种扩展,是每个国家自己制定的编码规范,比如一个中文字符是由两个扩展ASCII字符表示。但因为GB2312是国家标准所以会有一些问题,记得我们小时候玩一些繁体游戏时需要借助一些南极星之类的软件转换编码吗?因为台湾很多用的都是big5编码,他和GB2312的编码格式还是类似的,会显示出一些奇怪的文字或是偶尔也会有个别汉字。后来因为GB2312所包含的汉字太少了,所以又扩展出来GBK编码。GBK包括了大部分的汉字,并且还加入了big5中几乎所有的繁体字体(但big5和GBK中的繁体字体并不兼容)。之后还有GB18030编码,其实主要还是字符集的变化。ASCII—GB2312—GBK—GB18030他们都是向下兼容的,区分英文编码和中文编码的方法是高字节的最高位不为0,其实GB中文编码都是双字节字符集。
因为GB编码都是国家标准,所以如果要解决中文问题不能从扩展ASCII角度入手了,于是出现了unicode和utf。unicode分为UCS-2、UCS-4,目前常用的是UCS-2是用2个字节为字符编码,可以表示的数为2^16=65535,基本可以表示欧美和大部分亚洲汉字,并且因为UCS-2是双字节的所以每个汉字或英文都是由1个unicode构成,那拆字和统计字数比ASCII方便了很多。似乎unicode是比较完美了,可是它却有一个很致命的缺点,就是并不能和ASCII兼容。ASCII字符是单个字节的,比如”A”的ASCII是65。而Unicode是双字节的,比如”A”的Unicode是0065,这就造成了一个非常大的问题:以前处理ASCII的那套机制不能被用来处理Unicode了 。另一个更加严重的问题是,C语言使用’\0′作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一来,C语言的字符串函数将无法正常处理Unicode,除非把世界上所有用C写的程序以及他们所用的函数库全部换掉 。
于是出现了utf,它是将Unicode编码规则和计算机的实际编码对应起来的一个规则。现在流行的UTF有2种:UTF-8和UTF-16。UTF-8是以8位为单元对UCS进行编码,它定义了一种”区间规则”,这种规则可以和ASCII编码保持最大程度的兼容 。

Tags: , , ,