2

MQ を介して外部と通信するプロセスがあります。外部システムはメインフレーム マッチング (IBM z/OS) で実行されますが、プロセスは CentOS Linux プラットフォームで実行されます。これまでのところ、問題はありませんでした。

最近、メッセージに印刷できない EBCDIC 文字が埋め込まれたメッセージを受け取るようになりました。これらの文字は、8 バイト長の圧縮 ID として使用されます。受信すると、UTF (CCSID 1208) でエンコードされたキューに到着します。

応答メッセージを識別するために、元の 8 バイトを戻す必要があります。応答を送信する前に ID を UTF から EBCDIC に戻すための解決策を Java で見つけようとしています。

AS400Text クラスを使用して変換を行い、JTOpen ライブラリをいじってみました。また、取引相手は ID のスナップショットをバイト単位で送信してきました。しかし、変換後のバイト数を比較すると、元のメッセージとは異なります。

誰もこの問題に遭遇したことがありますか? 間違ったコード ページを使用している可能性がありますか?

ご意見をお寄せいただきありがとうございます。

取引相手からのバイト数 (位置 [5,14]):

00000   F0 40 D9 F0 F3 F0 CB 56--EF 80 04 C9 10 2E C4 D4  |0 R030.....I..DM|

プログラム出力:

UTF String: [R030ôîÕØœIDMDHP1027W 0510]
EBCDIC String: [R030ôîÃÃÂIDMDHP1027W 0510]
NATIVE CHARSET - HEX:     [52303330C3B4C3AEC395C398C29C491006444D44485031303237572030353130] 
CP500 CHARSET  - HEX:     [D9F0F3F066BE66AF663F663F623FC9102EC4D4C4C8D7F1F0F2F7E640F0F5F1F0] 

サンプルコードは次のとおりです。

private void readAndPrint(MQMessage mqMessage) throws IOException {
    mqMessage.seek(150);
    byte[] subStringBytes = new byte[32];
    mqMessage.readFully(subStringBytes);

    String msgId = toHexString(mqMessage.messageId).toUpperCase();

    System.out.println("----------------------------------------------------------------");
    System.out.println("MESSAGE_ID: " + msgId);

    String hexString = toHexString(subStringBytes).toUpperCase();
    String subStr = new String(subStringBytes);
    System.out.println("NATIVE CHARSET - HEX:     [" + hexString + "] [" + subStr + "]");

    // Transform to EBCDIC
    int codePageNumber = 37;
    String codePage = "CP037";

    AS400Text converter = new AS400Text(subStr.length(), codePageNumber);
    byte[] bytesData = converter.toBytes(subStr);
    String resultedEbcdicText = new String(bytesData, codePage);

    String hexStringEbcdic = toHexString(bytesData).toUpperCase();
    System.out.println("CP500 CHARSET  - HEX:     [" + hexStringEbcdic + "] [" + resultedEbcdicText + "]");

    System.out.println("----------------------------------------------------------------");
}
4

2 に答える 2

0

特別な 8 バイトは、実際には EBCDIC 文字ではなく、単に 8 バイトのデータのように思えます。そのような場合は、別の回答で述べたように、その8バイトをUTF8に変換せずに個別に処理してから、さらに処理するためにEBCDICに戻す必要があると思います。

使用している EBCDIC バリアントによっては、EBCDIC のバイトが意味のある UTF-8 文字に変換されない可能性が非常に高いため、受け取った UTF8 文字を EBCDIC に変換しても元のバイトを取得できません。

Google で簡単に検索すると、いくつかの EBCDIC テーブルが表示されます (例: http://www.simotime.com/asc2ebc1.htm#AscEbcTables )。文字が割り当てられていない EBCDIC の値が多数あることがわかります。したがって、それらが UTF8 に変換されると、それぞれが Unicode の個別の文字に変換されるとは思わないかもしれません。したがって、提案された処理方法は非常に危険でエラーが発生しやすいものになります。

于 2014-03-20T06:24:26.163 に答える