当调用rpg / db2存储过程传递包含双字节char的param时,我从ibm iseries .net提供程序获得转换错误。如果我将普通文本传递给同样的程序。
答案 0 :(得分:2)
您是否认为在参数列表中发送不同的数据类型是否需要使用匹配参数类型的不同过程?
答案 1 :(得分:0)
您需要以某种方式照顾不同的字符集。您可以确实使用一个程序来处理ebcdic(或ascii或您使用的单字节),并处理多字节。但是你将字节传递给程序而不是字符,然后以正确的方式解释字节以读取字符。这样做并不好玩,你会有一个想要制造问题的界面。我不建议这样做。
如果可能的话,我会为那些不同的字符集使用不同的程序。其中一个可能只是一个包装器,在转换参数后调用另一个包装器。 RPG可以处理Unicode,如果你知道该怎么做(好吧,至少是BMP,据我所知,当他们说他们做的时候他们并没有真正做UTF-16,因为还没有看到RPG中的UTF-16字符串,每个字符不完全是2个字节。但对于很多东西,你不会离开BMP)。
我认为我没有写过一个RPG程序,它有多字节字符串作为参数,但我认为它应该不是问题。只需确保使用正确的类型:
Dutf16str S 100C CCSID(1200)
这会给你一个UTF-16字符串(好吧,差不多),CCSID 1200用于UTF-16(我从来不能在RPG程序中运行UTF-8,但UTF-16也适用,如果你正确喂它)。您可以使用%CHAR()
和%UCS2()
内置函数将EBCDIC转换为UTF-16,反之亦然。因此,如果您使用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以byte order mark启动,以指示字节序。 RPG不明白(afaik),所以它会让你烦恼。尝试说服您的.net程序不要这样做,并确保发送正确的字节顺序。