特殊字符的问题

时间:2010-07-20 14:16:39

标签: java

我对这个特殊字符的典型问题感到困扰。

我们在生产tomcat服务器(安装在Linux上)上运行了一个mbean,它接收xml feed并发送以进行进一步处理。当mbean必须处理由'??'替换的特殊字符时,问题就出现了分数。 本地开发和QA服务器中的相同代码可以正常工作尽管操作系统版本,tomcat版本都相同。读取xml提要并发送到JMS Q的代码部分粘贴在下面:

StringBuffer article = new StringBuffer();

InputStreamReader is = new InputStreamReader(new FileInputStream(pendingFile), "utf-8");
int data;
while ((data = is.read()) != -1) {
    article.append((char)data);
}
is.close();
is = null;

log.debug("Read in \n" + article.toString());
try {
    js.writeTextMessage(article.toString(), "server", hostName, processor);
} catch (JMSException je) {
    log.error("jms exception: " + je.getMessage());
    // server probably shutdown
    this.stop();
    return;
}

上面的代码从“pending file”读取文件,将其附加到Stringbuffer,将文件读取到日志并发布到JMS队列。日志文件显示特殊字符?? '仅在Prod'中具有特殊字符的Xml提要如下:

<?xml version="1.0" encoding="UTF-8"?>
<hedline>
    <hl1>
        Hotelliyöpymiset: Missä hinta ja palvelu vastaavat toisiaan (tai eivät) - asiakastyytyväisyyden huippukaupungit
    </hl1>
</hedline>* 

我们尝试了所有可能性,其中包括:

  1. 在server.xml中为tomcat的URI编码为utf-8。
  2. 验证了LANG环境变量是linux上的en_US.UTF-8。
  3. 验证了xml文件的默认编码为UTF8而没有BOM。
  4. 我们无法找到原因是Tomcat服务器还是Linux OS。请帮忙。

2 个答案:

答案 0 :(得分:1)

不要将文章字符串记录为文本。将每个字符转储为十六进制整数。这样你可以判断它是日志记录是否失败,还是读取失败。

我不清楚JMS队列的行为是什么 - 它只是失败的日志记录,还是JMS?

答案 1 :(得分:0)

当您使用FileAppender通过Log4j进行日志记录时,您可以设置日志文件的编码:

<appender name="SOME_LOG" class="org.apache.log4j.RollingFileAppender">
<param name="Encoding" value="UTF-8" />

此外,必须安装适当的字符集才能正确显示字符。