UTF-8,ISO 10646的一种转换格式( 二 )


(比如C库中printf()函数)的兼容性 , 方便解析器解析US-ASCII值 , 且对其他值透
明 。
-UTF-8向UCS-4 , UCS-2两者中任一个进行相互转换比较轻易 。
-多8比特字节序列的第一个8比特字节指明了系列中8比特字节的数目 。
-8比特字节值FE和FF永远不会出现 。
-在8比特字符流中字符边界从哪里开始较轻易发现 。
-UCS-4字符串的字典分类顺序保留 。由于分类顺序在任一情况下不是文化上有效 , 因此
它的重要性当然有限 。
-Boyer-Moore快速搜索算法可以用于UTF-8数据 。
-UTF-8字符串可以通过一个简单的算法进行可靠性验证 , 也就是说 , 在任何一种编码下 ,
验证有效UTF-8字符串的耗费是低廉的 , 随着字符长度增加而缩小 。
UTF-8源于X/Open联合国际化组织XOJIG的项目 , 用于描述文件系统的安全UCS转
换格式[FSS-UTF] , 以便和UNIX系统兼容 , 以及在一种单一编码中支持多种语言的文字 。
最开始的作者是GaryMiller,GregerLeijonhufvud和JohnEntenmann 。后来KenThompson
和RobPike对UTF-8格式作了大量的工作 。
也可以从Unicode技术支持报告#4和Unicode标准2.0[UNICODE]中找到UTF-8的描
述 。权威性的引用 , 包括对UTF-16数据包含UTF-8的规定 , 在ISO/IEC10646-1[ISO-10646]
附录R中进行了阐述 。
2、UTF-8定义
在UTF-8中 , 字符采用1到6个8比特字节的序列进行编码 。仅仅一个8比特字节的一
个序列中 , 字节的高位为0 , 其他的7位用于字符值编码 。n(n>1)个8比特字节的一个序
列中 , 初始的8比特字节中高n位为1 , 接着一位为0 , 此字节余下的位包含被编码字符值的
位 。接着的所有8比特字节的最高位为1 , 接着下一位为0 , 余下每个字节6位包含被编码字
符的位 。
下表总结了这些不同的8比特字节类型格式 。字母x指出此位来自于进行编码的UCS-4
字符值 。
UCS-4范围(16进制)UTF-8系列(二进制)
00000000-0000007F0xxxxxxx
00000080-000007FF110xxxxx10xxxxxx
00000800-0000FFFF1110xxxx10xxxxxx10xxxxxx
00010000-001FFFFF11110xxx10xxxxxx10xxxxxx10xxxxxx
00200000-03FFFFFF111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
04000000-7FFFFFFF1111110x10xxxxxx...10xxxxxx
从UCS-4到UTF-8编码过程如下:
1)从字符值和上表第一列中决定需要的8比特字节数目 。着重指出的是上表中的行是相
互排斥的 , 也就是说 , 对于一个给定的UCS-4字符 , 仅仅有一个有效的编码 。
2)按照上表中第二列每行那样预备8比特字节的高位 。
3)将字符值的位填充在标记为x地方 , 从字符值的低位开始 , 将它们放在系列中最后的
8比特字节中 , 然后字符值的接着位放置到下一个8比特字节 , 如此重复 , 直到所有标
记位x的位都进行了填充 。
理论上 , 简单的通过用2个0值的8比特字节来扩展每个UCS-2字符 , 则从UCS-2到
UTF-8编码的算法可以从上面得到 。然而 , 从D800到DFFF间的UCS-2值对(用Unicode
说法是代理对) , 实际上是通过UTF-16来进行UCS-4字符转换 , 因此需要非凡对待:UTF-16
转换必须未完成 , 先转换到于UCS-4字符 , 然后按照上面过程进行转换 。
从UTF-8到UCS-4解码过程如下:
1)初始化UCS-4字符4个8比特字节的所有位为0 。
2)根据序列中8比特字节数和上表中第二列(标记为x位)来决定哪些位编码用于字符
值 。
3)从编码序列分配位到UCS-4字符 。首先从序列最后一个8比特字节的最低位开始 , 接
着向左进行 , 直到所有标记为x的位完成 。
假如UTF-8序列长度不大于3个8比特字节 , 解码过程可以直接赋予UCS-2 。

推荐阅读