|
正规编码则显得割鸡用牛刀。32位编码不只要比16位编码占用
多一倍的记忆或储存空间,而且在网络传输和信息处理上也需花费
比较长的时间。就经济效益而言,将来计算机和网络选择使用Unicode
的可能性,很明显地要高于选择使用32位的ISO10646正规编码。
问题是,在Unicode的世界里,遇到必须使用646第1、第2字面甚至
更后方字面的字符时,怎么办?Unicode协会提出的解决方式称为
UTF-16或代理法(surrogates)。 UTF为“a UCS(or Unicode)
Transformation Format”的缩写,UTF-16意即把原为32位的
ISO10646字符码转换为2或多个16位的Unicode。目前的作法是组
合两个Unicode字符码来代表一个ISO10646字符,如【图二】所示,
所以又称为代表法。两个做为代表的Unicode,位于前方(左方)
者称为高半字符,限定只能选用D800~DBFFh当中之一,位于后方
(右方)者称为低半字符,限制只可从DC00~DFFFh当中选择。高
低半字符的编码位置各为1,024=4×256,因此UTF-16总计可提供
(4×256)×(4×256)=16×65536个编码位置,亦即16个字面。
对BMP而言,当然无需使用UTF-16转码,所以UTF-16主要应用于
ISO10646的第1~第14字面(因为第15字面为专用字面,WG2不予编
码)。将ISO10646字符(编码范围0001-0000~000E-FFFFh)以
UFT-16转换成Unicode组合形式的规则,如【图三】所示,图中为了
方便对应16进制,特别将字符码表现成每4个位一组,中间以短杠
分隔。转换方式不难,将原来的32位ISO10646字符码,从右往左
取出10个位(即图中的Y10~Y1)前头附加上特定的6个位110111,
即成为低半字符。接着往左取出6个位(即图中的Y16~Y11)做为
高半字符的最低6个位,然后再往左取出4个位(即图中的Z4~Z1,
相当于Y20~Y17,其值可显示第0~第15字面),将其值减1,置于刚
才那6个位的左方,最后在最前方附加上特定的6个位110110,即
成为高半字符。以上所介绍的是UTF-16转换的观念,至于UTF-16的转
换公式和还原公式,请详见ISO10646标准或Unicode标准。
请特别注意,UTF-16系针对Unicode世界所设计的。也就是说,当
因特网和大部分的计算机都已经采用Unicode了,UTF-16才可用来表
现ISO10646第1~第14字面的字符码。很不幸的事实并非如此,现在
是ASCII世界而非Unicode世界。当某一个Unicode离开温室(某个以
Unicode为内码的操作系统或应用程序)之后,马上会被网络设备切
成两个8位的字节,并严密检查是否有任何字节为C0句柄,
至少数千个Unicoe将因此变得残缺不全。为了能让Unicode和ISO10646
字符码能安然通行于ASCII世界,Unicode协会特别提出UTF-8以解决
问题。UTF-8意即把原为32位的ISO10元码或原为16位的Unicode
转换为多个8位的字节。
利用UTF-8转码规则可将一个Unicode或ISO10646字符码转换成1~4
个字节的编码,如【图四】所示。UTF-8的转换规则很简单:若原始
字符码位于0000~007Fh(或0000-0000~0000-007Fh)的范围内,则
直接截取最右8个位即可,转换结果其实就是ASCII码。若原始字符
码大于007Fh(或0000-007Fh),亦即超出ASCII范围时,就必须转换
成2~4个字节。UTF-8规定,以转换后第1字节起头连续设为“1”
的标记位的数目表示转换成几个字节:110表示转换结果为2个位
元组,1110表示3个字节,而11110则表示4个字节。至于跟随在标
记位之后设为0的位,其在分隔标记位和字符码位。第2~第4
字节起头两个位被设为10当做识别,剩下的6个位才做为字符码
位使用。总计,2字节UTF-8码剩下11个字符码位,可用以转换
0080~07FFh的原始字符码。3字节剩下16个字符码位,可用以转换
0800~FFFFh的原始字符码。而4字节则剩下21个字符码位,可用来
转换0001-0000~001F-FFFh(即ISO10646第1~第31字面)的原始字
元码。请注意,虽然4个字节的UTF-8编码可包容1~3个字节的码,
3个字节的编码可包容1~2个字节的码,以及2个字节的编码可包
容1个字节的码,但是UTF-8规定转码时必须选择最短者。换言之,
ASCCI区只能转换成单一位,0080~07FFh的原始字符码只能转换成2
个位组长度,依此类推。
上一页 [1] [2] [3]
|