一、前言
汉字库中某一类汉字不是所有已汉化软件系统都能支持的,即使支持也不是全部输入法都能够输入,而这类汉字在地名和人名中经常见到,例如:西安浐河区、镕、詠等,如果涉及到多个代码集之间的
转换,则让系统设计者和系统用户颇感困惑。
笔者通过检索了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 之间的汉字代码转换通常是两者之间通讯时需要考虑的重要部分。本文旨在提供一个方法,解决扩展汉字代码的转换问题,以供相关程序设计者丰富和完善此部分程序的功能实现。
一、前言
汉字库中某一类汉字不是所有已汉化软件系统都能支持的,即使支持也不是全部输入法都能够输入,而这类汉字在地名和人名中经常见到,例如:西安浐河区、镕、詠等,如果涉及到多个代码集之间的
转换,则让系统设计者和系统用户颇感困惑。
笔者通过检索了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 之间的汉字代码转换通常是两者之间通讯时需要考虑的重要部分。本文旨在提供一个方法,解决扩展汉字代码的转换问题,以供相关程序设计者丰富和完善此部分程序的功能实现。