1. 程式人生 > >Java web中常見編碼亂碼問題(二)

Java web中常見編碼亂碼問題(二)

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中常見編碼亂碼問題(二)