现在的位置: 首页 >> 操作系统 >> FreeBSD >> Unicode与ISO10646(上)
添加时间:2005-8-21 来源:网教中国 作者:
Unicode与ISO10646(上)

正规编码则显得割鸡用牛刀。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


上一篇:FreeBSD中的设备命名规则 下一篇:FreeBSD 5内核源代码分析之copyin()实现原理
大部分文章摘自网上,如有侵犯您的权益请与我们联系,我们会第一时间进行处理,谢谢! [ 打印文章 ] [ 关闭窗口 ]
推荐文章
·FreeBSD handbook中文版 9 配制F
·FreeBSD 升级系统
·Ports & Package
·FreeBSD kernel 编译大法(二)ker
·FreeBSD 上使用Kerberos 5认证
·FreeBSD 5.x 中 gbfs 的修正,及
·FreeBSD 安装Linuxigd
·FreeBSD 使用cvsd创建安全的cvs
·FreeBSD trafcount命令介绍
·FreeBSD入门安装及汉化
相关文章
 
最新文章
·FreeBSD连载(94):基于NAT的负载
·FreeBSD连载(93):反向代理负载
·FreeBSD连载(92):基于DNS的负载
·FreeBSD连载(91):提升静态网页
·FreeBSD连载(90):单服务器性能
·FreeBSD连载(89):CGI和SSI的安
·FreeBSD连载(88):安全连接方式S
·FreeBSD连载(87):基于用户的访
·FreeBSD连载(86):对IP地址和域
·FreeBSD连载(85):配置Apache服(
Google