我們有一個通過MQ與外部通信的過程。外部系統在大型機上運行(IBM z/OS),同時我們在CentOS Linux平臺上運行我們的過程。到目前爲止,我們從未遇到任何問題是UTF to EBCDIC轉換無損?
最近我們開始接收消息,消息中嵌入了不可打印的EBCDIC字符。他們使用字符作爲壓縮的ID,8個字節長。當我們收到它時,它會到達我們用UTF編碼的隊列(CCSID 1208)。
他們需要返回原來的8個字節才能識別我們的響應消息。我正在嘗試在Java中找到一個解決方案,在發送響應之前將ID從UTF轉換回EBCDIC。
我一直在玩JTOpen庫,使用AS400Text類來做轉換。另外,交易對手以字節爲單位向我們發送了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("----------------------------------------------------------------");
}
'new String(subStringBytes);' - 這是使用您的默認編碼。你知道它是什麼嗎?你知道它支持你可能獲得的所有可能的字節組合,並且你知道它是否可逆嗎? – parsifal
此外,「UTF」沒有後綴沒有意義。你在說「UTF-8」嗎?如果是這樣的話,那麼答案顯然是否定的,因爲不是所有的字節序列在[UTF-8](http://en.wikipedia.org/wiki/UTF-8)中都是合法的 - 包括似乎是前三個字節的消息。 – parsifal
MQ中的CCSID 1208對應於UTF-8(http://www-01.ibm.com/software/globalization/ccsid/ccsid_registered.html)。當你說並非所有的字節序列都是合法的,你的意思是因爲UTF-8是可變寬度? –