【问题标题】:Convert String from EBCDIC to Unicode / UTF8将字符串从 EBCDIC 转换为 Unicode / UTF8
【发布时间】:2012-06-15 19:09:19
【问题描述】:

我可以在AS400 上将消息从Java 发送到Websphere MQ。如果我从WinXP 发送消息,如果我使用任何可访问的Locale 没有区别,包括完整的语言本地化;英文Locale也没有问题。正确编码的重要之处只有以下代码行:

msgId.characterSet = 1208;

不幸的是,它无效。我想从MQ Queue接收消息的情况有所不同。

  • 如果我从 Windows 操作系统收到来自 MQ Queue 的消息(没有任何语言包的英语),我可以从 MQ QueueString 的形式接收消息。

  • 如果 Windows 操作系统使用某些语言包完全本地化,我会收到异常

消息缓冲区发生异常: java.io.UnsupportedEncodingException: Cp870

来自代码(从 try-catch-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) {
}

  • 是否有一些参数,我想念那里的东西,因为 String from MQMessage#readLine()

  • 我这里的问题只是关于String的转换,

  • 我对来自MQMessage#getBytesEncode没有任何问题

【问题讨论】:

  • 任何帮助here
  • 感谢链接,但看起来像 I have this issue,不知道最终用户 PC 怎么可能没有任何问题,另一台得到 UnsupportedEncodingException,现在不知道
  • 正如@J-16 SDiZ 所指出的,您正在覆盖您的获取消息选项,因此实际上并未请求转换消息负载。但是,邮件标头始终会被转换,这就是您的错误的来源。该转换基于 QMgr 的 CCSID 设置,而不是 API 调用。 QMgrs CCSID 的设置是什么?
  • @T.Rob 我没有到 AS400 的 RDP :-),无法检查,相当于 Windows cp1250 编码页面 :-)

标签: java windows encode ibm-mq ebcdic


【解决方案1】:

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

更改区域设置时检查 Windows 代码页是什么,并查看 1208 是否适用于 msgId.characterSet

【讨论】:

  • +1 回答,区域设置没有任何问题,语言包(完整语言本地化),请问我的问题是我在哪里发现 EBCDIC 等同于 Windows 字符集(请参阅我对 @trashgod 的评论)跨度>
【解决方案2】:
 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 回答,请在这个问题中查看我的 cmets,你的意思是 gmo.options = MQC.MQGMO_NO_SYNCPOINT | MQC.MQGMO_CONVERT | MQC.MQGMO_WAIT; ???,我使用的示例来自 IBM 包和文档
  • @mKorbel 哪个 IBM 软件包或文档有上述错误? @J-16 SDiZ 关于同步点是正确的——在通过网络执行 JMS API 调用时,您应该始终使用同步点。如果您GET 一条消息并且连接在它被传递之前断开,那么如果不在同步点下,该消息将不可挽回地丢失。如果您确实使用了同步点,那么最糟糕的情况就是消息欺骗。 (JMS 规范调用由于会话处理“功能重复”而重新传递的消息,这是因为 COMMIT 调用上的会话失败结果不明确。)请使用同步点和 COMMIT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多