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("----------------------------------------------------------------");
}