简繁转换工具的设计与实现

 

1.            引言
随着公司在台湾地区业务的拓展,在以客户为中心的指导思想下,应用系统繁体化显得非常重要,OMC-S系统也不例外。从语言种类来讲,目前OMC-S系统已经有简体中文版和英文版两种版本了,那么,如何用最少的工作,特别是能很好的利用现有的简体中文版,来完成OMC-S系统繁体中文版呢?我们首先来看看简繁转换需要解决五个问题:
1)       语义不同。台湾和大陆对一些名词的叫法不同。如下表所示:

大陆叫法
台湾叫法
程序员
程式师
队列
佇列
打印机
印表机

 
 
 
 
 
 
2)       字体不同。大陆用简体字,台湾用繁体字。如下表所示:
 

大陆简体
台湾繁体
老板
老闆
后面
後面

 
 
    
 
3)       编码不同。大陆简体一般采用GB2312或者GBK。而台湾则通用的采用big5编码。如下表所示:
 

大陆编码
台湾编码
GB3212/GBK
big5

 
 
 
4)       简体和繁体的一对多关系。在简体中,老板和黑板中的板都是”板”,但是在繁体中却对应不同的字。如下表所示:
 

大陆简体
台湾繁体
老板
老闆
黑板
黑板

 
 
 
 
5)       表达方式不同

英文
简体
繁体
bit
位元
byte
字节
位元組

 
2.            常用字符集编码介绍
要了解不同语言间的转换,首先需要了解各种字符集编码的特性,从而可以找出转换解决方案,同时也可以分析字符集编码的识别、字符乱码等原因。
我们主要从以下三方面来了解字符集编码:
1)       编码范围
2)       编码对应的字符集(包含了哪些字符?)
3)       特点
2.1 ASCII
1)       编码范围。 ASCII码是7位编码,编码范围是0x00-0x7F。
2)       字符集。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。
3)       特点。只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。
2.2 GB2312
1)       编码范围。GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE 。
2)       字符集。GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。
3)       特点。GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般用10进制数来表示,区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。区位码是字符集的定义,GB2312是实际计算机环境中支持这 种字符集的编码。区位码和GB2312编码的关系有点像 Unicode和UTF-8。
2.3 GBK
1)       编码范围。GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。
2)       字符集。GBK字符集是GB2312字符集的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。GBK支持简体汉字、希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的繁体汉字、汉字部首符号、竖排标点符号等字符。
3)       特点。低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。有些系统中用0x40-0x7E中的字符(如0x5C("/")和0x7C("|"))做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就 是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也存在相应问题。
2.4 Big5
1)       编码范围。Big5是双字节编码,高字节编码范围是0x81-0xFE,低字节编码范围是0x40-0x7E和0xA1-0xFE。和GBK相比,少了低字节是0x80-0xA0的组合。0x8140-0xA0FE是保留区域,用于用户造字区。
2)       字符集。Big5收录的汉字只包括繁体汉字,不包括简体汉字,一些生僻的汉字也没有收录。GBK收录的日文假名字符、俄文字符Big5也没有收录。因为Big5当中收录的字符有限,因此有很多在Big5基础上扩展的编码,Windows系统上使用的代码页CP950也可以理解为是对Big5的扩展,在Big5的基础上增加了7个汉字和一些符号。Big5编码对应的字符集是GBK字符集的子集,也就是说Big5收录的字符是GBK收录字符的一部分,但相同字符的编码不同。
3)       特点。因为Big5也占用了ASCII的编码空间(低字节所使用的0x40-0x7E),所以Big5编码在一些环境下存在和GBK编码相同的问题,即低字节范围为0x40-0x7E的字符有可能会被误处理,尤其是低字节是0x5C("/")和0x7C("|")的字符。尽管有些区别,大多数情况下可以把CP950当作Big5的别名。
2.5 ISO-8859-1
1)       编码范围。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
2)       字符集。ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
3)       关系。因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
2.6 UCS-2UTF-16
1)       编码范围。Unicode组织和ISO组织都试图定义一个超大字符集,目的是要涵盖所有语言使用的字符以及其他学科使用的一些特殊符号,这个字符集就是通用字符集(UCS,Universal Character Set)。这两个组织经过协调,虽然在各自发展,但定义的字符位置是完全一致的。ISO相应的标准是ISO 10646,Unicode相应的标准是UCS-2和UTF-16, UCS字符集为每个字符分配了一个位置,通常用“U”再加上某个字符在UCS中位置的16进制数作为这个字符的UCS表示,例如“U+0041”表示字符“A”。UCS字符U+0000到U+00FF与ISO-8859-1完全一致。
2)       字符集。涵盖所有语言使用的字符以及其他学科使用的一些特殊符号。
3)       特点。UCS-2、UTF-16是UCS字符集(或者说是Unicode字符集)实际应用中的具体编码方式。UCS-2是两个字节的等宽编码,因为只是使用了两个字节的编码空间,所以只能对BMP中的字符做编码。UTF-16是变长编码,用两个字节对BMP内的字符编码,用4个字节对超出BMP范围的辅助平面内的字符作编码。UCS-2不同于GBK和Big5,它是真正的等宽编码,每个字符都使用两个字节,这个特性在字符串截断和字符数计算时非常方便。UTF-16是UCS-2的超集,UTF-16编码的两字节编码方式完全和UCS-2相同,也就是说在BMP的框架内UCS-2完全等同与UTF-16。实际情况当中常常把UCS-16当作UCS-2的别名。UCS-2和UTF-16也可以理解为和ASCII以及ISO-8859-1兼容,在ASCII编码或者ISO-8859-1编码的每个字节前加上0×00,就得到相应字符的UCS-2编码。UCS-2和UTF-16中会使用0×00作为某个字符编码的一部分,某些系统会把0×00当作字符串结束的标志,在处理UCS-2或UTF-16编码时会出现问题。
2.7 UTF-8
1)       编码范围。UTF-8是UCS字符集的另一种编码方式,UTF-16的每个单元是两个字节(16位),而UTF-8的每个单元是一个字节(8位)。UTF-16中用一个或两个双字节表示一个字符,UTF-8中用一个或几个单字节表示一个字符。UTF-8编码是根据一定规律从UCS-2转换得到的。
2)       字符集。涵盖所有语言使用的字符以及其他学科使用的一些特殊符号。
3)       特点。根据UTF-8的生成规律和UCS字符集的特性,可以看到UTF-8具有的特性:
Ø         UTF-8完全和ASCII兼容,也就是说ASCII对应的字符在UTF-8中和ASCII编码完全一致。范围在0×00-0×7F之内的字符一定是ASCII字符,不可能是其他字符的一部分。GBK和Big5都存在的缺陷在UTF-8中是不存在的。
Ø         大于U+007F的UCS字符,在UTF-8编码中至少是两个字节。
Ø         UTF-8中的每个字符编码的首字节总在0×00-0xFD之间,根据首字节就可以判断之后连续几个字节。
Ø         非首字节的其他字节都在0×80-0xBF之间;0xFE和0xFF在UTF-8中没有被用到。
Ø         GBK编码中的汉字字符都在UCS-2中的范围都在U+0800 - U+FFFF之间,所以每个GBK编码中的汉字字符的UTF-8编码都是3个字节。但GBK中包含的其他字符的UTF-8编码就不一定是3个字节了,如GBK中的俄文字符。
Ø         在UTF-8的编码的传输过程中即使丢掉一个字节,根据编码规律也很容易定位丢掉的位置,不会影响到其他字符。在其他双字节编码中,一旦损失一个字节,就会影响到此字节之后的所有字符。从这点可以看出UTF-8编码非常适合作为传输编码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值