我正在使用包含一些阿拉伯字符的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)
{}}
答案 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始终是一个很好的默认选择(并且让您免于担心任何文本是否会破坏您的选择),但当然您的程序可能需要使用特定的字符集。