0

在调用 rpg/db2 存储过程并传递包含双字节字符的参数时,我从 ibm iseries .net 提供程序收到转换错误。如果我传递普通文本,则相同的过程。

4

2 回答 2

2

您不认为如果您在参数列表中发送不同的数据类型,您将需要具有匹配参数类型的不同过程吗?

于 2013-05-02T16:03:06.073 回答
0

您将需要以某种方式处理不同的字符集。您确实可以使用一个程序来处理 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 程序不要这样做,并确保您发送正确的字节顺序。

于 2013-05-03T13:16:10.780 回答