将字符串从EBCDIC转换为Unicode/UTF8
我可以在AS400
上将消息从Java
发送到Websphere MQ
。如果我发送来自WinXP
的消息,如果我使用任何可访问的Locale
(包括完整的语言本地化;英语Locale
也没有问题。重要的是正确的编码是只有这个代码行:将字符串从EBCDIC转换为Unicode/UTF8
msgId.characterSet = 1208;
幸运的是,它是无效的。我想从MQ Queue
收到讯息的情况有所不同。
在我从
MQ Queue
从Windows操作系统获得消息(英语,没有任何语言包)的情况下,我能够在String
形式把消息从MQ Queue
。在的Windows操作系统是完全用一些语言包的本地化的情况下,我收到一个异常
Exception occured while to message buffer : java.io.UnsupportedEncodingException: Cp870
从码(取下balast从尝试 - 捕获 - finally块)
try {
Class.forName("com.ibm.mq.MQEnvironment");
MQEnvironment.hostname = hostname;
MQEnvironment.port = port1;
MQEnvironment.channel = channel;
MQEnvironment.userID = userID;
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
try {
qmgr1 = new MQQueueManager(qmanager);
MQGetMessageOptions gmo = new MQGetMessageOptions();
int openOptions2 = MQC.MQOO_INPUT_SHARED;
gmo.options = MQC.MQGMO_NO_SYNCPOINT; //Set no sync point
gmo.options = MQC.MQGMO_CONVERT; //Handles ASCII/EBCDIC
gmo.options = MQC.MQGMO_WAIT; //Wait until message arrives
gmo.waitInterval = 3000;
getq = qmgr1.accessQueue(responseQueue, openOptions2);
while (true) {
try {
responseFromQUEUE = "";
MQMessage msgId = new MQMessage();
//putmsg.characterSet = 437;// Set code page to ASCII
//putmsg.characterSet = 1200;// Set code page to UNICODE
msgId.characterSet = 1208;
getq.get(msgId, gmo);
String str = msgId.readLine();
//responseFromQUEUE = CpConv.tf870to1250(msgId.readLine());
//own EncodePage doesn't works too
if (responseFromQUEUE.length() == 0) {
break;
}
} catch (MQException mqx) {
if (mqx.reasonCode == EMPTY_QUEUE) {
} else {
}
}
}
} catch (MQException mqx) {
} finally {
}
} catch (IOException ex) {
} catch (ClassNotFoundException e) {
}
请
是有一些参数(S),我想念那里拿
String
从MQMessage#readLine()
的东西在这里我的问题是只有约
String
转换,-
我没有任何来自
与MQMessage#getBytes
Encode
问题
CP870是EBCDIC主机代码页。您将Windows更改为何时发生异常?本地变更后你仍然使用msgId.characterSet = 1208;
吗?看起来Java库无法将CP870中的传入消息转换为当前语言环境。
当您更改语言环境并查看1208是否正确msgId.characterSet时,请检查什么是Windows代码页。
+1为回答,语言环境没有任何问题,语言包(全语言本地化),请我的问题是我在哪里找到了EBCDIC等价于Windows字符集的地方(请参阅我对@trashgod的评论) – mKorbel
gmo.options = MQC.MQGMO_NO_SYNCPOINT; //Set no sync point
gmo.options = MQC.MQGMO_CONVERT; //Handles ASCII/EBCDIC
gmo.options = MQC.MQGMO_WAIT; //Wait until message arrives
这个代码是错的,你是覆盖选项,你需要|
他们。
+1回答,请参阅我在此问题中的意见,你的意思是'gmo.options = MQC.MQGMO_NO_SYNCPOINT | MQC.MQGMO_CONVERT | MQC.MQGMO_WAIT;',我使用的例子来自IBM软件包和文档 – mKorbel
是的。 (p.s. MQGMO_NO_SYNCPOINT是一种不好的做法) –
@mKorbel哪个IBM软件包或文档有上述错误?而@ J-16 SDiZ对于同步点是正确的 - 在网络上执行JMS API调用时,您应始终使用同步点。如果您收到一条消息并且连接在传送前丢失,那么如果不在同步点之下,则该消息将不可挽回地丢失。如果你确实使用同步点,你可以得到最糟糕的消息。 (JMS规范调用由于会话处理“功能重复”而重新递送的消息,这是因为在“COMMIT”调用上会话失败的结果不明确。)请使用同步点和“COMMIT”! –
任何帮助[here](http://www-304.ibm.com/support/docview.wss?uid=swg1IZ86625)? – trashgod
感谢您的链接,但看起来像[我有这个问题](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4296969),不知道最终用户PC之一有可能没有任何其他问题都得到了UnsupportedEncodingException,现在不知道 – mKorbel
正如@ J-16 SDiZ所指出的那样,你覆盖了你的获取消息选项,所以实际上并不需要转换消息有效载荷。但是,邮件标题总是会被转换,这就是您的错误来自哪里。该转换基于QMgr的CCSID设置,而不是API调用。什么是QMgrs CCSID的设置? –