使用MQ连接读取阿拉伯字符

时间:2015-10-09 19:05:15

标签: java ibm-mq

我正在使用包含一些阿拉伯字符的MQ连接来读取xml数据。但是在log4j日志文件中它显示了一些垃圾字符,如زÙ?ادسعÙ?دأØÙ。同样的垃圾值也用于进一步使用相同的程序。请帮助阅读正确的阿拉伯字符值并在log4j文件中显示相同的字符。

Mq配置细节是,   MQEnvironment.channel = SYSTEM.ADMIN.SVRCONN   MQEnvironment.CCSID = 1208

我担心的不是在日志中查看阿拉伯字符。实际上我不确定我是否正在阅读正确的阿拉伯字符或不使用MQ代码。

下面给出了用于从主机读取的代码。在日志文件中写入xml数据。

public boolean SendReceiveData (String sWriteQueName, String sReadQueName, String sRequestMessage, int iWaitInterval, int iExpiryInterval ){
        mqLogger.info(sessionId+"MQConnection->SendReceiveData() Called");
        int iQueOpenOptions;                                 
        int iMessageLength;
        int iCounter;

    try
       {
          //Open the write queue and put the message
          iQueOpenOptions = MQC.MQOO_OUTPUT;      
          messageInputQueue = queueManager.accessQueue(sWriteQueName, iQueOpenOptions);
          mqLogger.debug(sessionId+"Opened the queue - " + sWriteQueName);

          MQPutMessageOptions putMessageObject = new MQPutMessageOptions();
          MQMessage mqSendMessage = new MQMessage();

          mqSendMessage.format = MQC.MQFMT_STRING;
          mqSendMessage.expiry = iExpiryInterval;
          mqSendMessage.write(sRequestMessage.getBytes());
          mqSendMessage.originalLength = sRequestMessage.length();
          mqSendMessage.replyToQueueName = sReadQueName;
          mqSendMessage.characterSet = 1208;

          messageInputQueue.put(mqSendMessage,putMessageObject);
          mqLogger.info(sessionId+"Message put on the queue - " + sWriteQueName);

          messageInputQueue.close();
          mqLogger.debug(sessionId+"Closed the queue - " + sWriteQueName);


          //Open the read queue and get the message
          iQueOpenOptions = MQC.MQGMO_WAIT | MQC.MQGMO_CONVERT;
          messageOutputQueue = queueManager.accessQueue(sReadQueName, iQueOpenOptions);
          mqLogger.debug(sessionId+"Opened the queue - " + sReadQueName);

          MQGetMessageOptions getMessageObject = new MQGetMessageOptions();
          MQMessage mqReadMessage = new MQMessage();
          mqReadMessage.write(sResponseMessage.getBytes());

          getMessageObject.waitInterval = 500;
          mqReadMessage.correlationId = mqSendMessage.messageId;
          getMessageObject.matchOptions = MQC.MQMO_MATCH_CORREL_ID;
          mqReadMessage.encoding = 546;
          mqReadMessage.characterSet = 1208;

          for (iCounter = iWaitInterval / 500; iCounter > 0; iCounter--)
          {
              try
              {
                  mqLogger.debug("Inside the for loop to read the data from queue - " + sReadQueName);

                  Thread.sleep(500);
                  messageOutputQueue.get(mqReadMessage,getMessageObject);
                  mqLogger.info(sessionId+"Message read from the queue - " + sReadQueName);

                  iMessageLength = mqReadMessage.getDataLength();
                  byte[] btTempMessage = new byte[iMessageLength];
                  mqReadMessage.readFully(btTempMessage,0,iMessageLength);
                  sResponseMessage =new String(btTempMessage);

                  messageOutputQueue.close();
                  mqLogger.debug(sessionId+"Closed the queue - " + sReadQueName);

                  return true;
              }
              catch (MQException mqe)
              {}}

2 个答案:

答案 0 :(得分:0)

日志文件中的“垃圾字符”很可能是记录以阿拉伯字母zainÒ开头的文本的结果,该文本是使用字节值D8 B2编码为UTF-8的XML文件中发送的。

在ISO-8859-1中用作编码的这两个字节值导致显示ز

(后来我发现ا或D8 A7,这是一个alef,然后是dalد,一个看到的س,等等。)

您可以在OutputStreamWriter或PrintWriter等构造函数中设置文本文件的编码。

为了安全起见,您的Java程序可能会将阿拉伯语文本记录为一系列U-escape,这可以避免编码解释的所有问题 - 但您不会将它们视为阿拉伯字符。

您应该检查是否可以在您的系统上正确检查包含UTF-8中阿拉伯字符的文本文件。

如果(作为RealSkeptic评论)阅读是问题,那么您应该检查文本文件的打开方式。同样,可能需要在InputStreamWriter构造函数中设置编码才能正确解释UTF-8编码。

答案 1 :(得分:0)

行:

      mqReadMessage.write(sResponseMessage.getBytes());

              sResponseMessage =new String(btTempMessage);

是您程序的可疑行。在这两种情况下,您使用"默认"你的jvm的字符集。这可能是也可能不是严格的字符集。在字符和字节之间进行转换时,使用显式字符集可以更好地 。例如getBytes(charset)new String(..., charset)

使用哪种字符集取决于您和您的程序的要求。 UTF-8始终是一个很好的默认选择(并且让您免于担心任何文本是否会破坏您的选择),但当然您的程序可能需要使用特定的字符集。