jQuery AJAX 亂碼牽出的問題,及解決過程。

已完成 AJAX 輸入驗證AJAX 數據管理器
在此基礎上改成 jQuery 輸入驗證jQuery 數據管理器 後,POST 方式提交出現亂碼。

網上查的資料一邊倒的說法是「在參數中添加 contentType: "application/x-www-form-urlencoded; charset=UTF-8" 項」,嘗試發現無效。



初步調查發現:
  1. 原有的 form GET 、POST 提交例子無亂碼。
  2. 原有的 URL 提交例子無亂碼。
  3. 原有的 AJAX GET 、POST 提交例子無亂碼。
  4. jQuery AJAX GET 提交無亂碼。
  5. jQuery AJAX POST 提交有亂碼。
經 Firebug 調試查得:
  1. jQuery 在 AJAX POST 時默認向 contentType 中添加了「charset=UTF-8」;
    在服務器端用 request.getEncodingCharset() 取到「UTF-8」,得以證明。
  2. jQuery 在 AJAX GET 時不發送「charset=UTF-8」;
    在服務器端用 request.getEncodingCharset() 取到 null ,得以證明。
再查資料和檢查程序,發現原有的 form 提交例子、URL 提交例子和 AJAX 例子並不發送「charset=UTF-8」;
在服務器端用 request.getEncodingCharset() 取到 null ,得以證明。
即:
  1. 服務器未收到「charset=UTF-8」,無亂碼。
  2. 服務器收到「charset=UTF-8」,亂碼。
因此「在參數中添加 contentType: "application/x-www-form-urlencoded; charset=UTF-8" 項」的辦法無效。



檢查服務器端程序,發現取參數的工具函數作了「ISO8859_1」→「UTF-8」編碼轉換——由於很早以前遇到過 request.getParameter("...") 亂碼。
註釋顯示我最近一次修改這個工具函數在 2008 年 7 月 4 日。
當初編寫這個工具函數時,只知道服務器端內部用的是「UTF-8」,並不知道 request 有「charset=UTF-8」這個梗;加上「ISO8859_1」→「UTF-8」編碼轉換後再也不亂碼,就沒繼續深究。
本次 jQuery AJAX POST 提交, 服務器端取到的參數已是「UTF-8」編碼,工具函數仍然不分青紅皁白地作「ISO8859_1」→「UTF-8」編碼轉換,因而亂碼了。

進一步試驗,若是以「contentType: "application/x-www-form-urlencoded; charset=GB18030"」方式強制 jQuery AJAX POST 提交時用「GB18030」編碼,服務器端 作「ISO8859_1」→「UTF-8」編碼轉換不作編碼轉換均亂碼,但作「GB18030」→「UTF-8」編碼轉換後不亂碼。

對服務器端取參數的工具函數作出以下改進:
  1. 發現 request 有「charset」,「ISO8859_1」→ 服務器端編碼轉換。
  2. 發現 request 有「charset」、但與服務器端編碼一致時,作編碼轉換。
  3. 發現 request 有「charset」、且與服務器端編碼一致時,作編碼轉換。
  4. 若是轉換失敗,即返回未經轉換的參數。



問題解決。 若是不想大動干戈改 web.xml 或者 Filter 啥的,這樣的工具函數就算是「廣譜抗生素」了。
相關文章
相關標籤/搜索