unicode和ucs的区别

来源:互联网 发布:智者软件官网 编辑:程序博客网 时间:2024/06/08 07:30
   unicode,中文叫万国码,统一码,是统一码联盟为了世界上大多数文字系统进行整理和编码。
 
     unicode2.0后基本和ISO 10646规范保持一致. 
     和unicode类似,iso组织也在做同样的事情,iso开展了 ISO/IEC 10646项目,名字叫“ Universal Multiple-Octet Coded Character Set”,简称UCS。
     后来,双方意识到时间上不需要2套通用的字符集,所以双方开始进行整合,到unicode2.0时,unicode的编码和ucs的编码都基本一致。


     unicode在编码上和UCS保持一致,在实现上有自己的规则,而UCS只定义了编码标准。unicode的实现形式上 有UTF-8,UTF-16,UTF-32,还有UTF-7等。UCS编码也有自己的格式:UCS-2和UCS-4等等。可参考各自wiki:unicode 和ucs
     unicode的编码可以和UCS-2和UCS-4保持一致。但是又略有不同。UTF-16是UCS-2的扩展,UTF-32是UCS-4的子集。也就是说,UTF-16的实现上对code point的支持范围超过UCS-2,而UTF-32对code point的表示却又在UCS-4的范围之内。


     在编码层面上,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。
     UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。
     UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。
     group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。
     将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。


     Unicode最初支持16位的code point,后来发现不够用,于是用UTF-16扩展UCS-2。在BMP区域内的一片连续空间(U+D800~U+DFFF)的码位区段是永久保留不映射到字符,因此UTF-16利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。具体算法参考wiki:utf-16 .
所以,utf-16能表示的范围最大能到U+10FFFF,包含1个基本平面(BMP)和16个辅助平面。


     理论上UCS-4编码范围能达到U+7FFFFFFF,但是因为unicode和iso达成共识,只会用17个平面内的字符,所以UTF-32是UCS-4的子集。但是UTF-16是定长的编码,和UCS-4无论实现和编码都是基本一样的。

     当前,Unicode深入人心,且UTF-8大行其道,UCS编码基本被等同于UTF-16,UTF-32了,所以目前UCS基本谈出人们的视野中。(Windows NT用的就是UCS-2)



参考:
http://www.52rd.com/Blog/Detail_RD.Blog_thieven_4865.html
http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html
http://www.joelonsoftware.com/articles/Unicode.html
0 0
原创粉丝点击