Java web中常見編碼亂碼問題(二)
阿新 • • 發佈:2017-06-10
catalina 轉換 alt str 檢測 內容 tom 拼搏 image
根據上篇記錄Java web中常見編碼亂碼問題(一), 接著記錄亂碼案例:
案例分析:
2、輸出流寫入內容或者輸入流讀取內容時亂碼(內容中有中文)
原因分析:
a、 如果是按字節寫入或讀取時亂碼,應該先檢測系統編碼是什麽樣的,看看是否支持中文編碼的字符集。
System.out.println(System.getProperty("file.encoding"));
a1、如果是不支持中文的就要設置jvm編碼了,設置方法:
Windows環境就在catalina.bat配置:
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
Linux黃精就在catalina.sh配置:
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
設置好之後,應該就沒什麽大問題了。(註意:讀取內容要轉成字符串的形式,要指定字符集,如下圖:
a2、如果是支持中文編碼的字符集,還出現亂碼的話,首先要考慮a1中的註意事項,其次改換字符集為UTF-8,全面支持中文,
不會有漏洞。
b、如果是按字符寫入或讀取時亂碼,那麽寫入和讀取應指定同一字符集編碼(推薦是UTF-8)。example:
//通過字符流來寫入字符 String charset = "UTF-8"; FileOutputStream fout= new FileOutputStream("F:/test.txt"); OutputStreamWriter writer = new OutputStreamWriter(fout, charset);//指定字符集編碼 writer.write("這就是本該拼搏的年紀,卻想得太多,做得太少! "); //讀取字節轉換成字符 FileInputStream fis = new FileInputStream("F:/test.txt"); InputStreamReader reader = new InputStreamReader(fis, charset);//指定字符集編碼 StringBuffer content = new StringBuffer(); char[] buf = new char[64]; int len = -1; while ((len = reader.read(buf)) != -1) { content.append(buf, 0, len); } System.out.println(content.toString());
如果沒有指定就會獲取系統編碼,就有可能亂碼,解決方法可以參照a。
3、數據庫亂碼
這種情況就很簡單了,可以查看這篇博文MySQL 插入數據時,中文亂碼問題的解決
從上面可知,亂碼問題並不難解決,搞清楚源頭就好。其中要註意兩個點,再次提醒:
1、最好指定好系統默認編碼,否則沒有設置編碼的時候會獲取當前系統的編碼。(當你在windows中不會亂碼,但是移植到linux中就可能會出現亂碼)
2、設置好tomcat中uriencoding屬性,配置全局編碼過濾器會解決大部分請求數據亂碼的問題。
Java web中常見編碼亂碼問題(二)