首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

Struts 與 AJAX 亂碼問題終極解決:從編碼原理到 Filter 配置陷阱與 AJAX 請求頭修復

     編輯:J2EE

亂碼根源:編碼不一致的「雞同鴨講」

瀏覽器、Server、資料庫、檔案儲存編碼任一環節不一致即亂碼。99% 的產品支援中文完美,**亂碼全因開發者對國際化/編碼認知不足**。

編碼基礎知識

  • UTF-8:國際標準、變長、相容 ASCII、跨平台無位元組序問題、容錯性高(**首選**)
  • GBK:GB2312 擴展,含繁體/日文假名
  • GB2312:簡體中文標準
  • ISO-8859-1:單位元組拉丁字元,**不支援中文**,常作中轉編碼

檔案儲存編碼:隱形殺手

IDE/編輯器儲存編碼必須與頁面宣告一致。
操作:Notepad 另存新檔選編碼;Eclipse:Preferences → Content Types → Default Encoding → Update。

JSP/Struts 統一解決方案:CharacterEncodingFilter

  1. 使用 Tomcat 內建 SetCharacterEncodingFilter
  2. web.xml 關鍵配置:
<filter-mapping>
  <filter-name>SetCharacterEncoding</filter-name>
  <url-pattern>*.do</url-pattern>  <!-- 必須映射 *.do,非 * -->
</filter-mapping>
<init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
</init-param>

避坑:url-pattern 用 * 僅解決 JSP,Struts *.do 繞過 Filter → Action 亂碼。

JSP 頁面雙重宣告

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

資源檔、JS 檔編碼一致性

  • Properties:UTF-8 儲存 + native2ascii 轉義
  • JS 檔:儲存編碼 = 引用頁面編碼(建議全專案 UTF-8)

AJAX 亂碼專項修復:請求頭與回應頭雙管齊下

錯誤代碼

xmlhttp.setRequestHeader("Content-Type", "text/html");  // 缺 charset

正確代碼

// 請求端
xmlhttp.setRequestHeader("Content-Type", "text/html;charset=UTF-8");

// 回應端
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");

原理

XMLHttpRequest 可視為「動態生成的臨時頁面」,同樣需完整 Content-Type。JSP 頁首指令最終編譯為 response.setContentType() + setCharacterEncoding()。

全鏈路 UTF-8 一致性檢查清單

環節關鍵動作
檔案儲存IDE 統一 UTF-8
JSP 頁面pageEncoding + contentType 雙聲明
Filter映射 *.do,encoding=UTF-8
資源檔native2ascii 轉義
JS 檔儲存編碼 = 頁面編碼
AJAX 請求setRequestHeader 含 charset
AJAX 回應response.setContentType + setCharacterEncoding
資料庫連線JDBC URL 附 useUnicode=true&characterEncoding=UTF-8
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved