说说Unicode,V4.1.0

来源:互联网 发布:半球面车削编程 编辑:程序博客网 时间:2024/04/20 04:27
说说Unicode
  所谓Unicode,就是计算机世界中的一种字符编码的规范,由Unicode协会制定提出。与code page方案不同,Unicode为每个字符规定了唯一的二进制编码,而不会产生冲突。Unicode的设计目标是囊括人类历史上使用过的所有字符,目前看来Unicode的工作做的还是比较成功的。
?
  历史上曾经有两个组织设计过不同的字符统一编码方案:国际标准化组织(ISO)提出的ISO 10646,Unicode协会提出的Unicode。后来双方达成了一个共识,在1991年Unicode组织推出Unicode 2.0标准的时候,双方统一了编码。相比之下,ISO 10646的工作更出色,他们的汉字提供了不同的字形标准,包括中国大陆,台湾,日本和韩国。而Unicode标准则只提供中国大陆的汉字字形。不过ISO 10646需要花钱购买,而且相当昂贵;Unicode标准则是开放的,从1.1到最新的5.0.0beta都可以免费下载。ISO 10646的编码标准称为UCS(Universal Multi-Octet Coded Character Set),UCS使用31位二进制数进行编码(4个8位,但是UCS的第一个位必须是0,所以可以用的只有31位)。其中只需要用两个低8位(Octet)编码的方案称为UCS-2,4个8位(Octet)编码的方案称为UCS-4。
?
  由于Unicode与ISO 10646编码是统一的,所以Unicode也是4字节编码,而不是2字节。由于最高位必然是0,这样理论上Unicode的码位有231=2147483648个,除掉保留码位,能够使用的码位还是有20亿左右,足以用来表示地球上所有的符号了。当前的Unicode标准是2005年3月发布的4.1.0,这个标准对应着UCS-4。在UCS-4中,根据最高的字节,分成128个group。每个group根据次高的字节分成256个plane。现在可以使用的是0 group中0~16一共17个plane。其中0 group 0 plane被称为BMP(Basic Multi-lingual Plane)。BMP如果去掉两个高字节的0,其实就是UCS-2。
?
  Unicode在网络和计算机中存储和传输方式有UTF-8,UTF-16和UTF-32三种。UTF是Unicode Translation Format的缩写,后边的数字表示使用多少位作为一个单元来进行编码。RFC3629描述了UTF-8的编码方案,RFC2781则描述了UTF-16的编码方式。UTF-32与现在的Unicode标准长度一致,所以编码不需要转换,也就没有对应的RFC了。UTF-8编码后可能会变成1~4字节长。对于BMP的码位,UTF-16编码只是去掉高两个字节,也就是说:对于BMP,UTF-16与UCS-2是完全一致的(如果不考虑字节顺序)。但是对于其它的plane,UTF-16就必须用多个字节来表示了,这个多字节方案被称为surrogate。
?
  对于UTF编码,还有一个字节顺序的问题。Unicode标准中使用BOM(Byte Order Mark)来解决这个问题。在Unicode标准中,有两个特殊的码位,U+FEFF代表了一个0宽度的字符(zero width no-break space);U+FFFE则是不允许使用的码位。以UTF-16为例,在字节序列的最开始添加一个U+FEFF,如果接收到的是FEFF,则说明是Big Endian,顺序不变;如果接收到的是FFFE,则说明是Little Endian,需要反转顺序。UTF-8由于使用一个字节作为转换单位,所以不存在字节顺序问题。下表说明了BOM的使用情况:
编码方式 Big Endian Little Endian UTF-8 - - UTF-16 FE FF FF FE UTF-32 00 00 FE FF FE FF 00 00
  在Windows 2000及之后的产品中,都是使用UTF-16 Little Endian作为默认的编码方案的。
?
  还有重要的一点,Unicode标准只规定了编码方案,并没有硬性规定字符的字形风格,字形可以由设置字体来改变。
 
原创粉丝点击