1. 程式人生 > >中文亂碼問題(專案以UTF-8為例子)

中文亂碼問題(專案以UTF-8為例子)

要點:
本質是:提交資料的方式不同,進行資料加碼不同,所以解碼不同.(GET方式處理和POST方式處理) post方式處理編碼簡單.  request.setCharacterEncoding("UTF-8"); get方式處理編碼複雜.get方式要特殊處理,因為是URL提交,會自動將漢字轉化為特殊的編碼
要點:
a.客戶端將資料傳送到伺服器後在伺服器端解析將還原中文需要操作的是request. request.setCharacterEncoding("UTF-8");//用來解決post亂碼 request.getParameter("parameterName");//獲取資料 此時如果是post的話還要特殊轉碼.(完整程式碼如下) new String(request.getParameter("fileName").getBytes("ISO-8859-1"), "UTF-8");
b.伺服器端將資料發回瀏覽器端同樣也要設定編碼,這樣在頁面中才能顯示成中文.操作的是response. response.setContentType("text/html;charset=UTF-8");(這裡設定的資料的加碼,應該與瀏覽器解碼用的編碼一致,才能顯示正常.)
要點:中文資料和特殊字元都是轉碼成了16進位制資料前面加%
"你"轉碼為: %E4%BD%A0
要點: 在伺服器端解碼的時候,專案是什麼編碼就只能轉成什麼編碼中文才能正常顯示,同理在將中文資料發到頁面時候也只能傳送與頁面相同的編碼資料瀏覽器才能正常顯示中文. 由於get方式通過URL是轉碼成了ISO-8859-1,所以當專案是ISO-8859-1專案時候,不設定response.setContentType()也是能正常顯示的.
發生中文亂碼有三種情況:(本質是GET方式處理和POST方式處理) 1.表單     (1)post       解決方法:    request.setCharacterEncoding("UTF-8");//當問get方式提交時候,該設定無效,可以不要?是     (2)get         解決辦法:    new String(str.getBytes("ISO-8859-1"),"UTF-8"); 2.超連結(本質是GET提交URL傳參提交)處理方式與get方式提交一樣. <a href="http://www.baidu.com?name=你好">測試</a>
3.response.sendRedirect("pages/forwardShow.jsp"); //  (本質是URL提交,在servlet中進行了轉碼成功獲取資料後重定向又會被加碼成ISO-8859-1) 注意: response.sendRedirect("跳轉地址?name=中文");  這裡在url中傳遞時不能直接手寫中文,會無效。 如果要傳遞可以向用變數來 再傳遞message String  message ="中文";
response.sendRedirect("跳轉地址?name="+message);
特別說明: 如果瀏覽器是IE6及以下版本,則第2和3種情況中仍然會出現亂碼(當中文是奇數時會出現亂碼),這時候需要編碼後再傳向頁面: String    result =    java.net.URLEncoder.encode("待傳的資料", "UTF-8"); 補充: 用Servlet做檔案上傳的時候用的是本質用的post提交,所以處理方式同post一樣。 request.setCharacterEncoding("UTF-8");
思考:  如果是forward轉發資料,在下一個servlet中處理方式還是一樣看資料來源是什麼格式. 其源頭還是看資料在傳輸的時候是採用的什麼編碼,比如在編碼的時候用的UTF-8,那麼解碼自然就用UTF-8來解,就可以解決亂碼問題,注意UTF-8和gbk和ISO-8859-1之間是不能互轉的,如果有有中文,解碼和編碼的不是同一個charset 那麼就會出現亂碼.     public static void testEncode() {// 驗證 編碼和解碼
                                     // 結論:
                                     // 如果字串中有中文一定要在編碼的時候指定能支援中文的編碼EG:UTF-8;GB2312;gbk
                                     // (也就是在得到byte[]的時候指定編碼),然後解碼的時候指定編碼的時候的編碼就可以正確解碼
        // 特別注意的是: bgk 和UTF-8之間是不能互相轉換的.


        String message = "yves你好";
        try {
            byte[] result = message.getBytes("UTF-8");// ISO-8859-1 GB2312
                                                      // UTF-8
            System.out.println(new String(result, "UTF-8"));// 顯示正確
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }