本发明涉及两个数据处理系统之间的信息互换,更特别是涉及将一个N-字节稀疏数据组的字符串转换为另一个稀疏数据组中的另外的N-字节字符串。本发明还特别涉及有关双字节字符串的转换方法,即将两个16毕特数据代码中的任何一个转换为另一个16毕特数据代码,例如IBM主机代码和IBM个人机代码之间的转换。 在所指的符号代码变换中,两个数据处理系统之间的信息互换要求有相容性。某些互换代码是共同使用的,因此这些代码之间需要转换的频率增加。例如,一种在IBM PS/2型55个人计算机中使用的互换代码IBM PC代码。IBM PC代码是美国信息交换标准(“ASCII”)的一种扩充,以适用于书写和日本语。另外一种互换代码IBM主机代码是用于由国际商用机器公司所制造的各种中间范围和主机系统。IBM主机代码是一种类似扩充二-十进制交换码(“EBCDIC”)的扩展。
信息交换代码规定了各国语言的字符组。在大多数语言中,所必需的符号或字符的数量较少。例如,英语只使用26个罗马字母,其中每个字母分别有一个大写字母和一个小写字母,共有52个符号。德语仅需增加7个符号,它们是接受发音符号地三个元音(各有大写和小写字母)和小写希腊字母β符号。法语、荷兰语、西班牙语、意大利语、葡萄牙语和斯堪的纳维亚语都相类似地允许增添少量符号,所有这些语言都有一个代码组。所有数都可以由10个数字来表达。还有一些余地用于各种标点符号和其它的特定符号,诸如各种国家货币符号(例如,)。这了表达所有这些字符,提供256个字节(每个字节8个毕特)是绰绰有余的。对于每个单字节语言,存在有两组标准互换代码。它们包括美国信息交换标准码(“ASCII”)和扩充二-十进制交换码(“EBCDIC”)。对于单字节语言从一互换代码转换为另一互换代码,需要提供一个单独的256字节转换表。
和大多数语言不同的是汉语、日本语和朝鲜语所包含的字符多于256个。传统写法的汉字超过13000个表意字符。日本语使用了3000至8000个表意字符(汉字字符)和几百个用作数字、平假名和片假名的其它的符号。事实上,日本语、朝鲜语、传统汉字和简化汉字的表意字符组其容量和大小都不同,使得互换代码之间的转换进一步复杂化,为了处理如此之大的字符库,这些语言的互换代码组,对每个字符使用了一个16毕特的双字节,这样就可以表达65536个字符(216)。该双字节组用几种不同的方式来安排。对日本语来说,在各种计算机中,通常使用四种不同的字符组。朝鲜语使用五种,传统汉字使用二种。例如,一个汉字符号“大”,在IBM主机代码中是“455B”,在IBM PC代码中是“91E5”,在汉字指定编号代码中是“1371”,和在JIS(日本工业标准)代码中是“3471”。这些编号都以十六进制来表示。
在理论上,一种在单字节互换代码之间进行转换的方法,同样也可以在双字节转换中使用。但遗憾的是,在实用中,这样一来将要求提供比处理单字节语言要多得多的存贮器。对于单字节语言,该转换数的长度仅为256个字节。而对一个双字节语言,该转换表的长度将超过128000个字节。
双字节字符组(“DBCS”)转换的传统是使用一系列相关语言与单独的双字节字符相比较以确定其有效性。这些步骤本质上是一系列的范围的比较。一旦该字节的有效性被确认,就用一语言相关方法来将该字符的阵列标志导入双字节的256×256项的转换阵中。这时该阵列标志用来复原来自转移阵列的适当字符。
虽然并不直接相关于在两个互换代码之间的转换,美国专利4,701,746中Ueda等教导了一种方法,该方法适用于简化传统方法所产生的范围比较和标志。Ueda等提出了一种用来将16毕特代码信号转换为13毕特代码信号的代码转换装置,Udea等基本考虑的是一系列多余数据项向连续标记的转换。该专利实际上没有考虑日本语大的字符组。为了双字节字符的表的完整性,需要使用接近128000字节的存贮空间。但是,Ueda等的方法可以处理的最大值大约是8000数据项。因此,Ueda等的技术不能应用于传统或简化汉字,通常也不能应用于多字节系统。和本发明相比,Ueda等提供的误差检验能力是有限的。
因此,本发明的一个目的是提供一种在两个数据处理系统之间进行信息互换的方法。
本发明的另一目的是提供一种从一互换代码到另一互换代码的双字节字符串(“DBCS”)的转换的方法。
本发明的另一目的是提供一种在IBM PC代码和IBM主机代码之间双字节字符串的转换方法。
本发明还有一个目的是提供一种针对多种国家语言的、由双字节字符串所表示的字符转换的独特方法。
现在说明上述各目的是如何实现的。将第一互换代码的字符的双字节表示转换为从-双字节转换阵列复原的第二互换代码的字符的双字节表示是由从第一代码的字符表示的第一和第二字符所产生的进入该阵列的行和列标志来提供的。为此目的,对第一互换代码的字符的双字节表示的第一字节和第二字节分别提供第一和第二国家语言检验阵列。把第一字节与第一国家语言检验阵列相比较,返回一个第一数值。将第二字节与第二国家语言检验阵列相比较,返回一个第二数值。然后分别相对于第一和第二范围极限评价第一和第二数值,如果满足,则允许该返回值作为标志进入国家双字节转换表。
响应于在第一范围极限内的第一数值的返回和在第二范围极限内的第二数值的返回,第一和第二的数值被作为标志数值进入该双字节转换表。该标志数据这时才用来复原一第二互换代码的字符的双字节表示。否则,响应于来自第二字节的评价步骤的超出范围极限的值的返回,返回一个无效指示。响应于来自第一字节的评价步骤的超出范围极限的值的返回和响应于第二字节的范围极限内一个值的返回,则把第一字节返回的数值与一个无效字符值、一个特殊处理字符值和一个被保留的字符值相比较并返回这些数值中的一个作为该转移过程的输出。
本发明的上述以及附加的目的、特征和优点在下面的详细讨论中将会更明显的。
被认为是本发明的特征的新颖的特征如权利要求书所述。本发明本身以及最佳的使用方式、进一步的目的和其它优点将结合附图参照下面的实施例的详细描述而得到的很好的理解。
图1是一分布数据处理系统的方框图;
图2是本发明响应用于双字节字符的转换方法和流程图;
图3图示说明了一多字节字符串的第二字节的一检验阵列的数据结构;
图4图示说明了一多字节字符串的第二字节的一检验阵列的数据结构;和
图5是一转换阵列的数据结构。
现在参阅附图,特别参照附图1。图1给出了一种可用来实施本发明的方法和系统的分布数据处理系统8的框图。由图可以看出,分布数据处理系统8包含一含最好是IBM公司的PS55型个人计算机所构成的个人计算机系统10和一台由IBM公司的诸如AS/400型个人计算机所构成的中型个人计算机系统12。个人计算机系统10的用户接口包括视频显示装置14和键盘16。在视频显示装置14的框15中显示出了表示“大”的意思的汉字和由ASCII或IBM PC代码表示的16进制双字节字符串“91E5”16。
个人计算机系统10被功能性的图示出来。显示装置14由计算机10中的中央处理器18来控制。键盘用来向计算机10提供用户的输入。中央处理器18直接访问存贮装置20和22以及一系统存贮器24。通讯适配器26向通过计算机系统和计算机系统之间的一个网络的一通道连线27提供一接口。
计算机12作为诸如计算机系统10这样的主机装置的服务网络终端进行操作。计算机12包括通过一通讯适配器30来接收通讯线27传送的数据的一个中央处理器28。中央处理器28控制一显示装置32和接收通过键盘34送入的用户的输入。在显示装置32中的框33里显示了“大”的汉字字符以及该汉字字符的IBM主机代码双字节字符串“455B”16。计算机系统12还包括有系统存贮器36和直接访问存贮装置38和40。
如果由字符串所表示的信息没有丢失或完全删节,则在计算机系统10和计算机系统12之间传送的这些字符串必须在两个互换代码之间转换。下面将研究“大”的汉字字符的字符串的转换。在最佳实施例中,这种转换发生在一网络(例如在个人计算系统10)的终端。对于计算机系统10在系统存贮器24中驻留程序是一个用来将IBM PC代码双字节字符串转换为IBM主机代码双字节字符串的程序43,一个第一字节检验表42、一个第二字节检验表44和一个转换表46,所有这些都用于转换程序。
现在参阅图2,图2示出了本发明的转换方法的流程图。与接收一在源互换代码中以双字节字符串编码的字符时,程序开始执行。一目标代码的识别是根据一目标机器的识别来确定的。在步骤50中,确定了Index1(标志1)和Index2(标志2)两个变量。为了从源互换代码到目标代码转换特殊函数,而从一直接访问的存贮装置20或22中取回合适的表、范围极限和触发值,并将其装入系统存贮器24中。当一程序被用于所有的语言和所有的互换代码时,该表、范围极限和触发值是一种国家语言和互换代码所特有的。在两个各为256字节的检验表的每个表中,对于有效标志来说该触发值等于或大于该最大十六进制(范围极限)。下面的表1-4是用来转换从IBM PC代码到IBM主机代码表示的日本语字符的典型表。
表1提供常规的多个触发值,所有这些值至少等于或超过OXFO16的范围极限值。
表1
常数
_i_="FF"hex (* 无效 *)
_r_="FE"hex (* 保留 *)
_s_="FD"hex (* 特殊 *)
包含有256个字节的第二字节检验表用来执行两个检验函数中的一个。步骤52表明了利用该第二字节检验表实施检验函数的解决方案。该检验函数:
(1)Index2=V2(a2)
这里a2是双字节字符串中的第二字节,是一使用第二字节作为地址而在该字节检验阵列中进行查找操作以返回Index2的值的表。每一个有效标志值或触发值表明一个无效字符而从该操作中被返回。第二字节的一典型检验表再现在表2中。
表2
Verify2:字节的阵列[$OO..$FF]=(
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
$00, $01, $02, $03, $04, $05, $06, $07, $08, $
09, $0A, $0B, $0C, $0D, $0E, $0F,
$10, $11, $12, $13, $14, $15, $16, $17, $18, $
19, $1A, $1B, $1C, $1D, $1E, $1F,
$20, $21, $22, $23, $24, $25, $26, $27, $28, $
29, $2A, $2B, $2C, $2D, $2E, $2F,
$30, $31, $32, $33, $34, $35, $36, $37, $38, $
39, $3A, $3B, $3C, $3D, $3E, _i_,
$3F, $40, $41, $42, $43, $44, $45, $46, $47, $
48, $49, $4A, $4B, $4C, $4D, $4E,
$4F, $50, $51, $52, $53, $54, $55, $56, $57, $
58, $59, $5A, $5B, $5C, $5D, $5E,
$5F, $60, $61, $62, $63, $64, $65, $66, $67, $
68, $69, $6A, $6B, $6C, $6D, $6E,
$6F, $70, $71, $72, $73, $74, $75, $76, $77, $
78, $79, $7A, $7B, $7C, $7D, $7E,
$7F, $80, $81, $82, $83, $84, $85, $86, $87, $
88, $89, $8A, $8B, $8C, $8D, $8E,
$8F, $90, $91, $92, $93, $94, $95, $96, $97, $
98, $99, $9A, $9B, $9C, $9D, $9E,
$9F, $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $
A8, $A9, $AA, $AB, $AC, $AD, $AE,
$AF, $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $
B8, $B9, $BA, $BB, _i_, _i_, _i_);
在步骤54中,将该值标志2(Index2)与范围极限相比较以确定一有效的字符输出是否被接收,如果该触发值被返回,则表明该标志2变量超出范围极限并且在步骤56中给出一个无效指示。不必进一步进行与特殊字符有关的操作。如果该标志2的值指示一有效字符,则这时在步骤58中,对于标志2求得一检验函数V1。
表3被命名为VERIFY 1,它是用来自双字节字符串的8毕特的第一字节作为一输入以变量的检验阵列,该检验函数;
(2)Index1=V1(a1)
这时a1是双字节字符串的第一字节,是一使用第一字节作为一地址在该检验阵列进行查找操作以返回一标志1(Index1)的值的表。a1的检验表与a2的检验表有少许不同。如果-i-(“FF”16)从该表被返回,则整个双字节字符串无效。如果该表返回-r-(“FF”16),则该字符被保留,这表明该字符将来可能有效但并不是现在有效。如果该表返回-S-(“FD”16),则该字符表明需要特殊处理。“特殊处理”可以用来替代本发明去执行常规的、众所周知的转换,例如对于能被简单转换的用户定义的字符或对于一定的汉字字符范围。
表3
Verify1:字节的阵列[$OO..$FF]=(
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, $00, $01, $02, $03, _r_, _r_, _r_, $04, $
05, $06, $07, $08, $09, $0A, $0B,
$0C, $0D, $0E, $0F, $10, $11, $12, $13, $14, $
15, $16, $17, $18, $19, $1A, $1B,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
_i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _i_, _
i_, _i_, _i_, _i_, _i_, _i_, _i_,
$1C, $1D, $1E, $1F, $20, $21, $22, $23, $24, $
25, $26, _r_, _r_, _r_, _r_, _r_,
_s_, _s_, _s_, _s_, _s_, _s_, _s_, _s_, _s_, _
s_, $27, $28, $29, _i_, _i_, _i_);
在步骤60中,确定对该标志1返回的值是否小于该阵列的范围极限。如果不是,紧接着执行步骤64,将标志1的值与表明一无效字符的触发值相比较。如果标志1等于无效字符的触发值,则执行步骤66,其结果是产生一误差信号。不再进一步执行与该字符有关的操作。
如果标志1不等于用于无效字符的触发值,则执行步骤64的NO转移。在步骤68中,将标志1与表明一保留的触发值相比较,以确定是否一保留值(例如用户编程字符)作为一字符而被接收(步骤70)。否则,设定一特殊处理提示(步骤72)。然后可处理涉及这种特殊函数字符的返回操作。
步骤60的YES转换是执行步骤74,这一步骤是实际的转换操作。为了对使用了新的互换代码的原始字符的字符串进行复原,标志1和标志2向一双字节转换阵列提供行和列标志。表4是这种阵列的部分内容,在该表中第一个十六进制数,即由符号“S”开始并紧跟着的四个字符是目标IBM主机代码,在括号内的第二个十进制数是IBM PC代码,并且不是该阵列的部分。该第二个十六进制数是为转换到IBM PC代码时使用的。从该转换函数的执行返回的是新的双字节字符串。
(3)RESULT=t(Index1,Index2)
表4
表:单词阵列[$OO..$29,$OO..$BB]=((
$4040(*8140*), $4344(*8141*), ...
$FDFF(*8240*), $FDFF(*8241*), ...
$4347(*8340*), $4381(*8341*), ...
$41C0(*8440*), $41C1(*8441*), ...
...
...
...
$4868(*9140*), ... $455B(*91E5*)
, ...
...
...
...
表5是用于前述处理的一伪码程序。
表5
function Translate(c:word):word;
var
Index1,Index2:BYTE;
begin
Index2:=Verify2[Byte2(c)];
if Index2<$FO then
begin
Index1:=Verify1[Byte1(c)];
if Index1<$FO then
Translate:=Table[Index1,Index2]
else
case Index1 of
_i_:Translate:=Invalid;
_r_:Translate:=Reserved;
_s_:Translate:=Special(c);
end
end
else
Translate:=Invalid;
end;
现在参阅附图3至附图5,这些图表明了将来自计算机系统10的互换代码的汉字字符“大”的字符串转换为计算机系统12的互换代码的字符串的数据结构。为简单起见,这些图中与表2至表4中相对应的项采用十进制而不是用十六进制表示。如上面所表明的,对于汉字字符“大”的十六进制双字节字符串是“91E5”16。每个字节被分别处理。这样,对于检验函数“91”16和“E5”16提供了自变量。“91”16和“E5”16的等效的十进制数分别为145和229。
对于第一个字节的检验函数是由数据结构102来确定。十六进制“00”到“FF”转换为十进制整数0到255。0到255中的每一个数都对应于“i”,“r”,“s”中的一个或者“0”到“41”中的一个值。对于“0”到“41”,只允许仅仅对应一个值作为进入一转换阵列的标志。该双字节字符串的第一字节转换为十进制表示为145。在图表中对应于145的十进制整数为13(如由框104所指明的),它作为第一检验函数而被返回。
第二字节的检验函数是由数据结构106来确定。16进制数“00”到“FF”再次转换为十进制整数0到255。0到255的每个数都对应于“i”或“0”到“187”的一个值。在该数据结构中,“0”至“187”每个值只出现一次。该双字节字符串的第二字节转换为十进制表示是229。在图形中相应于229的是十进制整数164(用框108指出的),它作为第二检验函数而被返回。
矩阵110是日本语字符和转换阵列,它有188列(编号为0到187)和42行(编号为0到41),这些行和列对应于赋于检验函数结果的唯一的范围。和表4不同,仅以IBM主机代码表示。这样,检验函数的解(它们提供了i,r和s)指明被转换的双字节串的行和列。这样,行13(由数字112指明)和列164(由数字114指明)所共有的位置116是所希望的结果,此处是“455B”16。
本发明提供了一种单一的程序,是用一种国家语言转换和检验表来执行的,以便针对朝鲜语、日本语、传统汉字和简化汉字在两种互换代码之间进行字符转换。与传统方法相比,其操作简化,减少了实现转化的操作时间。从图3-5的数据结构可以看出,该转换和检验表所占用的存贮空间远小于128000字节。对于日本语(包括所有的汉字、平假名、片假名和数字符号)的转换阵列和对于一种转换方式的两个检验阵列仅占存贮器的16304字节。
本发明给出了从一种互换代码转换为另一种互换代码的比字节字符表示,而这些被转换的字节不必代表可显示的字符。这些字节可以代表来自有意义的值的任何集合的项。当这些有意义的值是不连续的值时,更体现了本发明的优点,正像本发明披露的用于双字节数值的转换的方法一样,本发明还可以扩大到字节数值从一数据集到另一数据集的转换。双字节转换使用了两个检验阵列和一个二维转换阵列。三字节转换方法将使用三个检验阵列和一个三维转换阵列。这可以扩展到任何n字节转换。
本发明虽然特别参考一最佳实施例作了展示和描述,本领域的技术人员都了解,在不脱离本发明的精神和范围的前题下,可对本发明的形式和细节作各种变型。