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

Java 中文亂碼終極指南:字符集原理、常見編碼、亂碼成因與統一編碼最佳實踐

     編輯:Java 相關知識

中文亂碼是 Java 開發者的「成長必經之痛」。本文從字符、字符集、編碼三大核心概念入手,梳理 ASCII、ISO-8859-1、GB2312/GBK/GB18030、BIG5、UTF-8/UTF-16 等主流編碼特性,剖析亂碼產生的三大場景,給出「全鏈路統一編碼」工程化解決方案。

核心概念釐清

術語定義例子
字符抽象符號(字母、漢字、表情符號)'中', 'A', '😀'
字符集字符的有序集合,賦予每字符唯一代碼點Unicode (U+4E2D), GB2312
編碼將代碼點轉換為位元組序列的規則UTF-8: E4 B8 AD, GBK: D6 D0

主流中文編碼特性對比

編碼覆蓋範圍位元組長度典型場景
ASCII128 字符 (英數符)1 固定早期系統、協議頭部
ISO-8859-1西歐語言 256 字符1 固定HTTP 預設、Java 內部字串傳輸
GB23126763 漢字 + 符號1-2舊版簡體中文系統
GBKGB2312 + BIG5 + 擴展1-2Windows 簡繁混排 (CP936)
GB18030Unicode 映射,強制標準1-4中國軟體產品強制認證
BIG5繁體中文 13000+ 字1-2台灣/香港舊系統
UTF-8全 Unicode (149k+ 字符)1-4 變長**現代 Web/資料庫/檔案/傳輸首選**
UTF-16全 Unicode2/4 固定/代理對Java char/String 內部表示、Windows API

Java 內部機制關鍵點

  • String 內部採用 **UTF-16** (JDK 9+ 壓縮為 Latin1/UTF-16)。
  • JVM 運行期**所有字符統一以 Unicode 存儲**,支援多語言。
  • I/O 操作 (FileReader, InputStreamReader, HttpServletRequest) **必須顯式指定 charset**,否則退回到平台預設 (Windows=GBK, Linux=UTF-8) → 亂碼根源。

三大亂碼場景與解決模板

1. 檔案讀寫

// 讀取:指定源檔編碼
try (BufferedReader br = new BufferedReader(
        new InputStreamReader(new FileInputStream(file), "GBK"))) { ... }

// 寫入:統一輸出 UTF-8
try (BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) { ... }

2. Web 請求/響應 (Servlet/JSP/Spring MVC)

// 全局 Filter (Spring Boot: server.servlet.encoding.charset=UTF-8)
request.setCharacterEncoding("UTF-8");      // POST 請求體
response.setCharacterEncoding("UTF-8");     // 響應體
response.setContentType("text/html;charset=UTF-8");

3. URL 參數 / HTTP Header 傳輸

// 發送端:URLEncoder.encode(param, "UTF-8")
// 接收端:Tomcat 8+ 需在 server.xml Connector 加 useBodyEncodingForURI="true" URIEncoding="UTF-8"
// 歷史遺留 GET 參數 ISO-8859-1 → 目標編碼:
String fixed = new String(param.getBytes("ISO-8859-1"), "UTF-8");

工程化最佳實踐:全鏈路 UTF-8

  1. 源碼檔案:IDE 統一保存為 UTF-8 (IntelliJ: Settings → File Encodings → Global/Project = UTF-8)。
  2. 編譯輸出:javac -encoding UTF-8 / Maven: <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>。
  3. 資料庫:表/庫/連接字串全 UTF-8 (MySQL: characterEncoding=utf8mb4, useUnicode=true)。
  4. 容器/框架:Tomcat URIEncoding="UTF-8"、Spring Boot server.servlet.encoding.*。
  5. 前端頁面:<meta charset="UTF-8">、JS 檔案 UTF-8。
  6. 日誌/監控:Logback/Log4j2 <charset>UTF-8</charset>。

緊急修復單行代碼 (治標不治本)

// ISO-8859-1 (網路傳輸/錯誤解碼) → 正確編碼
String correct = new String(broken.getBytes("ISO-8859-1"), "UTF-8");

**切記**:此行代碼只能作為臨時搶險,**必須**配合上游編碼統一徹底根治。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved