2 バイト文字を含むパラメーターを渡す rpg/db2 ストアード・プロシージャーを呼び出すと、ibm iseries .net プロバイダーから変換エラーが発生します。通常のテキストを渡す場合も同じ手順です。
2 に答える
何らかの方法で、さまざまな文字セットを処理する必要があります。実際、1つのプログラムを使用してebcdic(またはasciiまたは使用するシングルバイト)を処理し、同じプログラムを使用してマルチバイトを処理できます。ただし、文字ではなくバイトをプログラムに渡し、そのバイトを正しい方法で解釈して文字を読み取ることになります。それを行うのは面白くないし、問題を起こしたがるインターフェースを手に入れることになります。私はそれをお勧めしません。
可能であれば、これらの異なる文字セットには異なるプログラムを使用します。それらの1つは、パラメーターを変換した後にもう1つを呼び出す単なるラッパーである可能性があります。あなたが何をすべきかを知っていれば、RPGはUnicodeを処理できます(まあ、少なくともBMPは、私の知る限り、UTF-16をまだ見ていないので、彼らが言っているときに実際にはUTF-16を行いません-文字ごとに正確に 2 バイトではない RPG の文字列. しかし、多くの場合、BMP を離れることはありません)。
マルチバイト文字列をパラメーターとして持つ RPG プログラムを書いたことはないと思いますが、問題にはならないと思います。正しいタイプを使用していることを確認してください。
Dutf16str S 100C CCSID(1200)
それはあなたにUTF-16文字列を与えます(まあ、ほとんど)、CCSID 1200はUTF-16用です(RPGプログラム内でUTF-8を実行することはできませんでしたが、正しくフィードすればUTF-16も同様に機能します)。%CHAR()
関数と組み込み関数を使用して、EBCDIC から UTF-16 に、またはその逆に変換でき%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
遭遇する可能性のあるもう 1 つの問題は、UTF-16 がエンディアンを示すバイト オーダー マークで始まる場合があることです。RPGはそれを理解していないので(私の知る限り)、それはあなたを悩ませます. .net プログラムがそうしないように説得し、正しいバイト順を送信するようにしてください。