2010-07-20 135 views
0

我很担心这个特殊字符的典型问题。特殊字符问题

我们有一个运行在生产tomcat服务器(安装在Linux上)的mbean,它接收xml提要并发送进一步处理。当mbean必须处理由'??'取代的特殊字符时,问题就会出现。分数。 虽然操作系统版本,tomcat版本都是一样的,但本地开发和QA服务器可以使用相同的代码,其工作正常。的代码读取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; 
} 

以上代码从“待处理档案”读取文件,其附加到StringBuffer的,所述文件读取到一个日志和发布到JMS队列。日志文件显示特殊charas为? '只有在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>* 

我们尝试了所有其中包括possibilites:

  1. URI编码为UTF-8 server.xml中为Tomcat。
  2. 在linux上验证了LANG环境变量是en_US.UTF-8。
  3. 验证了xml文件的默认编码为UTF8,没有BOM。

我们无法找到原因是否与Tomcat服务器或Linux操作系统有关。请帮忙。

回答

1

不要将文章字符串记录为文本。将每个字符转储为十六进制整数。这样你就可以知道是记录这是失败,或读取这是失败。

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

0

当经由Log4J日志例如用FileAppender,可以设置日志文件的编码:

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

此外,必须有一个合适的字符集安装正确显示字符。