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

J2EE 亂碼問題終極解決方案:編碼原理、過濾器統一處理、AJAX 專項修復

     編輯:J2EE

核心成因:編碼不一致的「雞同鴨講」

瀏覽器、Server、資料庫、檔案儲存編碼任一環節不一致,即產生亂碼。常見編碼:

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

檔案儲存編碼:隱形殺手

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

JSP/Servlet/Struts 統一解決方案:CharacterEncodingFilter

  1. 採用 Tomcat 內建 SetCharacterEncodingFilter(webapps/jsp-examples/WEB-INF/classes/filters)
  2. 在 web.xml 配置:
<filter>
  <filter-name>SetCharacterEncoding</filter-name>
  <filter-class>filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SetCharacterEncoding</filter-name>
  <url-pattern>*.do</url-pattern>  <!-- 關鍵:Struts 擴展名,非 * -->
</filter-mapping>

避坑:url-pattern 用 * 只能解決 JSP,Struts 的 *.do 請求會繞過 Filter,導致 Action 亂碼。

JSP 頁面宣告雙重保險

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
  • contentType:告訴瀏覽器回應編碼 → 生成 response.setContentType() + setCharacterEncoding()
  • pageEncoding:告訴 JSP 編譯器原始檔編碼 → 影響生成的 Servlet Class

資源檔國際化亂碼

Properties 檔儲存為 UTF-8,並用 native2ascii 轉換中文為 Unicode 轉義序列(\uXXXX),確保 JVM 正確讀取。

JavaScript 檔案亂碼

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 聲明。Servlet 回應同理,JSP 頁首指令最終編譯為這兩行代碼。

總結:全鏈路 UTF-8 一致性

環節關鍵動作
檔案儲存IDE 統一設為 UTF-8
JSP 頁面pageEncoding + contentType 雙聲明
Filter映射 *.do,init-param 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