汉字代码转换办法简述

一、前言

汉字库中某一类汉字不是所有已汉化软件系统都能支持的,即使支持也不是全部输入法都能够输入,而这类汉字在地名和人名中经常见到,例如:西安浐河区、镕、詠等,如果涉及到多个代码集之间的

转换,则让系统设计者和系统用户颇感困惑。

笔者通过检索了MICROSOFT 和IBM 两公司的官方网站关于汉字处理方面的内容,获得了一些比较有用的资料,通过一些试验后,解决了这部分汉字在PC 和IBM 主机之间代码转换和通讯的问题。

二、代码集

目前软件系统中使用最多的代码集中,单字节码当属ASC II ,可以表达拉丁字母、数字和常用符号等;双字节码当属UNICODE ,它除了能表达ASCII 所包括的字符外,还可以表达目前世界绝大多数语言的字符,包括汉字字符;扩展ASCII 码也常常用来表达一些需要双字节表达的字符。另外,在某些行业所使用的IBM 主机系统中,则较多地使用了EBCDIC 字符集,既有单字节的表达,也有双字节的表达;。

汉字字符代码集中,GB2312-80和GB13000是先后颁布的两个国家标准。前者可以表达 6763个简体汉字和682个非汉字符号;后者1994年颁布,支持20902个字符,兼容ISO 10646-1:1993的CJK 字符集标准。

还有一些不太常用的代码集, 或者说很少见到软件实现的代码集,如已提及的ISO 标准(虽然它不常用,但标准涵盖了以上各个字符集)。

GBK 字符集是对GB2312-80的一个扩展,达到GB13000的所有的20902个字符,里面还包含了繁体汉字,总共20975个汉字字符,911个非汉字符号和1894个用户定义字符(如偏旁、部首、笔画等)。

三、代码转换

在各类不同的软件系统之间进行信息传输和通讯,必然涉及到代码转换的问题,PC 系统中常有UNICODE 和ASCII 码之间的转换,PC 系统和IBM 主机系统之间有ASCII 码和EBCDIC 码之间的转换。由于篇幅和技术材料所限,以下仅讨论ASCII 码和EBCDIC 码之间的转换。

1. 单字节ASCII 和EBCDIC

单字节的ASCII 码和EBCDIC 码之间的转换比较简单,只需要建立一个对照表即可。(代码的数字表达如无特别说明,均使用16进制,以下同)

部分字符对照码见下表:

表1 单字节ASCII 和EBCDIC 对照表(部分)

2. 汉字双字节ASCII 和EBCDIC :

双字节的ASCII 采用一个扩展ASCII 码(即字节的最高位置1)加一个标准ASCII 码或者两个都使用扩展ASCII 码来表达一个汉字或非汉字符号;双字节的EBCDIC 编码也采用此方式来表达,但双字节字符串两端采用分隔符来与单字节字符区分,首分隔符为0E ,尾分隔符为0F 。

两者的对照关系见如下图1和图2(GBK 标准):

图1 中文简体双字节字符结构图(扩展ASCII 码)

图2 中文简体双字节字符结构图(EBCDIC 码)

3. 汉字双字节码转换算法:

从结构图中可以看出,标准GBK-1、GBK-2覆盖了GB2312-80的字符集,其转换算法涉及到几个繁杂的对照表,对照关系是高字节和低字节拆开经过计算后,再到对照表中查到对应

字符,最后合并两新字符而成。由于此两部分的汉字代码比较常见,转换工具比较成熟,容易寻找,这里不进行详细讨论。

我们真正感兴趣的是在GBK-3和GBK-4代码的转换方法上,许多繁体字、偏僻字都集中在这两个区中。参看图3和图4所描述的编排规则,再结合图1和图2,不难发现,由于是顺序编码,其转换算法应比GBK1和GBK2简单许多。

下面仅以GBK-3的扩展ASCII 码(以下简称PC 码)到EBCDIC 码转换关系为例,GBK-3的逆转换和GBK-4的双向转换可以以类似方法设计出来。算法以C 语言描述:

sum1 = (f1-0x81) * 0xbe + s1 - 0x3f;

if (s1>0x7f)

sum1--;

f2 = sum1 / 0xbd +0x81;

s2 = sum1 % 0xbd;

if(f2>0x81)

s2+=sum1/0xbd;

s2 += 0x40;

if(s2 >= 0x80)

s2++;

if(s2 >= 0xfe)

{

s2 = s2 - 0xfe + 0x41;

f2++;

}

图3 部分GBK 码的编码规则(扩展ASCII 码)

图4 部分GBK 码的编排规则(EBCDID )

算法细节描述:

○ 首先算法入口f1是汉字PC 码的第一字节,s1为第二字节

○ sum1为其在当前PC 码区内的顺序值,并考虑到s1没有0x7f 和0xff 编码;

○ 根据顺序偏移,决定其在对应EBCDIC 码的区间第一和第二字节的分布,见图2。但第二字节在0x80、0xfe 和0xff 没有编码(这点在图2中没有明确说明,笔者通过编码传到IBM 主机中测试总结了这个规则);

○ 算法出口结果f2是主机EBCDIC 码的第一字节,s2是第二字节。如果要和单字节区分开,前面需要加0x0e 后面需要加0x0f 。

4. 应用:

通过以上算法,我们来看前面所提几个字的代码值(16进制)转换对应关系:

浐: PC 码为9BBA EBCDIC码为 9BEF 属于GBK-3

镕: PC 码为E946 EBCDIC码为 C1A8 属于GBK-4

詠: PC 码为D481 EBCDIC码为 B759 属于GBK-4

四、总结

日常生活中内地和港、澳、台及海外华侨之间信息交流日益频繁,信息处理工具对汉字(包括简体和繁体)处理的支持就具有不可轻视的地位。IBM 主机在银行等大型机构中具有广泛的应用,主机和PC 之间的汉字代码转换通常是两者之间通讯时需要考虑的重要部分。本文旨在提供一个方法,解决扩展汉字代码的转换问题,以供相关程序设计者丰富和完善此部分程序的功能实现。


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn