2010-07-20 173 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" /> 

此外,必須有一個合適的字符集安裝正確顯示字符。