TongWeb下亂碼問題解決思路

realwangpu發表於2020-11-06

解決亂碼問題主要看以下幾項配置,重點要了解這些編碼設定所起的作用

注:亂碼問題看TongWeb的server.log日誌基本沒用,重點是看應用採用的編碼以及作業系統、TongWeb的編碼設定。

1. Linux下先通過local -a檢視作業系統是否有相應的中文字符集。

2. Linux下再看環境變數LANG值,通常為zh_CN.GBK或zh_CN.UTF-8。通過echo $LANG檢視,通過export LANG=zh_CN.GBK來設定。

3. JDK引數-Dfile.encoding=GBK,加在TongWeb啟動指令碼中。

以上兩項是JDK的預設編碼,-Dfile.encoding優先於LANG環境變數。

file.encoding 這個屬性的英文解釋:

This property is used for the default encoding in Java, all readers and writers would default to use this property. “file.encoding” is set to the default locale of Windows operationg system since Java 1.4.2. System.getProperty(“file.encoding”) can be used to access this property. Code such as System.setProperty(“file.encoding”, “UTF-8”) can be used to change this property. However, the default encoding can not be changed dynamically even this property can be changed. So the conclusion is that the default encoding can’t be changed after JVM starts. “java -Dfile.encoding=UTF-8” can be used to set the default encoding when starting a JVM. I havesearched for this option Java official documentation. But I can’t find it.

4. TongWeb 的Web容器 request 、response預設編碼GBK。

5.  對於URL的編碼,在TongWeb的 http通道中設定,預設GBK。“URL編碼格式”相當於tomcat的URIEncoding。“ uri處理”相當於tomcat的useBodyEncodingForURI。

     若tomcat下不亂碼,而在TongWeb下亂碼,則可參考tomcat配置來配置TongWeb。

 URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, GBK will be used. 

 useBodyEncodingForURI:This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.

6. 資料庫存入資料亂碼,還要看資料本身的編碼設定。另外不同資料的JDBC  url也有編碼設定,如:MySQL的jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8   。

7. 重點檢視應用編碼規則,一定要了解應用的編碼用法。

    主要看應用filter中設定的編碼:request.setCharacterEncoding("UTF-8")

   應用程式碼中有沒有做轉碼,如: new String(test.getBytes("iso-8859-1"),"utf-8");

8.日誌亂碼主要原因:

   (1)telnet終端編碼與日誌輸出的編碼不一致導致,把日誌下載到windows下用Notepad++等工具檢視,並進行UTF-8與GBK轉碼試試。

    (2) log4j編碼設定不對,注意引數中的log4j.appender.file.encoding=UTF-8。

 

 

 

 

相關文章