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

Java/J2EE 中文亂碼終極解決方案:全鏈路 UTF-8 統一編碼實戰手冊

     編輯:Java 程式設計入門

亂碼根因:編碼不一致的「塔羅牌」

Java 內部運行統一用 UTF-16 (char),但邊界 (輸入/輸出/編譯/存儲) 涉及字節流轉換,若各環節編碼不一致 → 亂碼。

失效的臨時方案

  • new String(bytes, "ISO-8859-1") → 破壞封裝、到處補丁
  • 容器配置 URIEncoding → 遷移即失效、違背容器與應用分離原則

核心原則:應用層統一指定 UTF-8,全鏈路「結紮」

UTF-8 兼容所有語言,無平台綁定,是唯一跨平台穩健選擇。

五大關鍵邊界「結紮」清單

1. 開發/編譯環境

  • IDE (IntelliJ/Eclipse/VS Code) → Project Encoding = UTF-8
  • javac -encoding UTF-8 / Maven <properties><project.build.sourceEncoding>UTF-8</...>

2. 請求入口 (Servlet/Filter)


// 必須在讀取任何 request 參數前調用
request.setCharacterEncoding("UTF-8");
  • 配置 web.xml 啟用 Filter (Spring CharacterEncodingFilter / 自定義)
  • 順序關鍵:Filter 必須在其他 Filter/Servlet 之前

3. 響應輸出 (JSP/頁面)


<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
  • HTML Head:<meta charset="UTF-8"> (HTML5) 或 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

4. 數據庫連接


# MySQL
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

# PostgreSQL
jdbc:postgresql://localhost:5432/db?charSet=UTF-8

# Oracle (驅動 12.1+ 自動 UTF-8,舊版需 orai18n.jar)
jdbc:oracle:thin:@host:1521:sid
# 確保 NLS_LANG=AL32UTF8 (客戶端環境變數)
  • 表/列字符集:CHARSET=utf8mb4 (支援 Emoji)

5. 文件/XML/外部系統交互

  • 讀寫文件:new InputStreamReader(is, StandardCharsets.UTF_8)
  • XML:<?xml version="1.0" encoding="UTF-8"?>,解析器自動識別
  • HTTP Client:HttpClient / RestTemplate / WebClient 默認 UTF-8,顯式設置 Charset.UTF_8

框架層面驗證 (零亂碼實踐)

驗證清單 (部署前必跑)

  1. 中文參數 GET/POST 往返不亂碼
  2. 中文頁面顯示正常 (含 Emoji 😀)
  3. 數據庫讀寫中文正確 (含補充平面字符)
  4. 文件上傳/下載中文文件名正常
  5. 日誌輸出中文可讀

中文亂碼不是 Java 的錯,是「邊界未統一」的錯。在應用啟動第一行代碼前,就要為所有邊界「結紮」好 UTF-8。這是專業工程師的基本功,亦是架構師的責任邊界。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
框架關鍵配置
Struts 1/2web.xml Filter + JSP pageEncoding + struts.xml i18n.encoding=UTF-8
Spring MVCCharacterEncodingFilter (order=1) + @Controller 默認 UTF-8
Tapestry默認 UTF-8,@Inject @Symbol(SymbolConstants.CHARSET) "UTF-8"
Hibernate/JPA連接 URL encoding + hibernate.connection.charSet=UTF-8
Jdon/EJB同 Servlet Filter + 部署描述符 encoding