在调用 rpg/db2 存储过程并传递包含双字节字符的参数时,我从 ibm iseries .net 提供程序收到转换错误。如果我传递普通文本,则相同的过程。
2 回答
您不认为如果您在参数列表中发送不同的数据类型,您将需要具有匹配参数类型的不同过程吗?
您将需要以某种方式处理不同的字符集。您确实可以使用一个程序来处理 ebcdic(或 ascii 或您使用的单字节),并使用相同的程序来处理多字节。但是您将向程序传递字节而不是字符,然后以正确的方式解释这些字节以读取字符。这样做并不有趣,而且您将拥有一个想要制造问题的界面。我不建议这样做。
如果可能的话,我会为这些不同的字符集使用不同的程序。其中一个可能只是一个包装器,在转换参数后调用另一个。RPG 可以处理 Unicode,如果你知道该怎么做(好吧,至少BMP,据我所知,当他们说他们做的时候,他们并没有真正做 UTF-16,因为还没有看到 UTF-16- RPG 中的字符串,每个字符不完全是 2 个字节。但对于许多事情,你不会离开 BMP)。
我不认为我曾经写过一个以多字节字符串作为参数的 RPG 程序,但我认为这应该不是问题。只要确保您使用正确的类型:
Dutf16str S 100C CCSID(1200)
这会给你一个 UTF-16 字符串(嗯,差不多),CCSID 1200 是用于 UTF-16 的(我永远无法在 RPG 程序中运行 UTF-8,但 UTF-16 也可以,如果你正确输入它)。您可以使用内置函数从 EBCDIC 转换为 UTF-16 %CHAR()
,反之亦然。%UCS2()
因此,如果您使用 UTF-16 接口编写实际程序,则可以轻松编写具有 EBCDIC 接口的小程序,让它将输入转换为 UTF-16 并调用 Unicode 版本。
当您拥有 Unicode 处理程序(名为UNI_PGM
)时,您可以像这样编写一个包装程序(名为EBC_PGM
)。我在没有编译和测试的情况下编写了这段代码,所以它可能有问题,但我认为你可以阅读,如何从中完成。
* some useful H-Specs:
H MAIN(main)
H DFTACTGRP(*no) ACTGRP(*caller)
* prototypes
Dmain PR EXTPGM('EBC_PGM')
D ebcdic_parm 100A
Duni_pgm PR EXTPGM('UNI_PGM')
D utf16_parm 100C CCSID(1200)
* implementation
Pmain B
D PI
D ebcdic_parm 100A
Dutf16_parm S 100C CCSID(1200)
/free
utf16_parm = %ucs2(ebcdic_parm: 1200);
uni_pgm(utf16_parm);
// if you have in/out parms, you need to reconvert:
ebcdic_parm = %char(utf16_parm);
/end-free
Pmain E
您可能会遇到的另一个问题是,有时 UTF-16 以字节顺序标记开头,以指示字节顺序。RPG 不明白这一点(afaik),所以它会打扰你。尝试说服您的 .net 程序不要这样做,并确保您发送正确的字节顺序。