将字符串从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),我想念那里拿StringMQMessage#readLine()

  • 的东西在这里我的问题是只有约String转换,

  • 我没有任何来自MQMessage#getBytes

    Encode问题
+1

任何帮助[here](http://www-304.ibm.com/support/docview.wss?uid=swg1IZ86625)? – trashgod

+0

感谢您的链接,但看起来像[我有这个问题](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4296969),不知道最终用户PC之一有可能没有任何其他问题都得到了UnsupportedEncodingException,现在不知道 – mKorbel

+0

正如@ J-16 SDiZ所指出的那样,你覆盖了你的获取消息选项,所以实际上并不需要转换消息有效载荷。但是,邮件标题总是会被转换,这就是您的错误来自哪里。该转换基于QMgr的CCSID设置,而不是API调用。什么是QMgrs CCSID的设置? –

CP870是EBCDIC主机代码页。您将Windows更改为何时发生异常?本地变更后你仍然使用msgId.characterSet = 1208;吗?看起来Java库无法将CP870中的传入消息转换为当前语言环境。

当您更改语言环境并查看1208是否正确msgId.characterSet时,请检查什么是Windows代码页。

+0

+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 

这个代码是错的,你是覆盖选项,你需要|他们。

+0

+1回答,请参阅我在此问题中的意见,你的意思是'gmo.options = MQC.MQGMO_NO_SYNCPOINT | MQC.MQGMO_CONVERT | MQC.MQGMO_WAIT;',我使用的例子来自IBM软件包和文档 – mKorbel

+0

是的。 (p.s. MQGMO_NO_SYNCPOINT是一种不好的做法) –

+1

@mKorbel哪个IBM软件包或文档有上述错误?而@ J-16 SDiZ对于同步点是正确的 - 在网络上执行JMS API调用时,您应始终使用同步点。如果您收到一条消息并且连接在传送前丢失,那么如果不在同步点之下,则该消息将不可挽回地丢失。如果你确实使用同步点,你可以得到最糟糕的消息。 (JMS规范调用由于会话处理“功能重复”而重新递送的消息,这是因为在“COMMIT”调用上会话失败的结果不明确。)请使用同步点和“COMMIT”! –