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

Java Web 中 UTF-8 與 GB2312 編碼轉換實戰:解決中文亂碼終極指南

     編輯:Java 程式設計入門

在基於 HTTP 協議的 JSP/Servlet 應用中,請求參數預設以 ISO-8859-1 (Latin-1) 傳輸,導致中文參數直接取得時變成亂碼。本文提供三大核心場景的標準轉換方案,徹底解決中文編碼難題。

場景一:請求參數 UTF-8 → GB2312 轉換

當瀏覽器以 UTF-8 編碼送出表單 ( `

` 或頁面為 UTF-8),伺服器端需手動轉碼:

String utf8Value = request.getParameter("name"); // 取得錯誤解碼的字串
byte[] bytes = utf8Value.getBytes("ISO-8859-1");  // 還原原始位元組
String gb2312Value = new String(bytes, "GB2312"); // 正確解碼為中文

原理: Servlet 容器預設用 ISO-8859-1 解碼 URL/表單參數,將 UTF-8 的多位元組序列誤解為單字元。透過 getBytes("ISO-8859-1") 可無損取回原始位元組陣列,再以正確字集重建字串。

場景二:已知長度的 InputStream 讀取為位元組陣列

網路資料流可能分多次到達,不可假設一次 read() 即讀完。正確迴圈讀取模式:

ServletInputStream in = request.getInputStream();
int total = request.getContentLength(); // 已知長度
byte[] buffer = new byte[4096];         // 緩衝區
byte[] result = new byte[total];        // 最終結果
int readTotal = 0;

while (readTotal < total) {
    int n = in.read(buffer);            // 實際讀取位元組數
    if (n == -1) break;                 // 流提前結束
    System.arraycopy(buffer, 0, result, readTotal, n);
    readTotal += n;
}
// result 現在包含完整請求主體

關鍵點:使用 System.arraycopy 高效複製,避免手工迴圈效能損耗。

場景三:未知長度的 InputStream 讀取 (ByteArrayOutputStream)

當 Content-Length 不存在 (如 Chunked Transfer Encoding),利用 ByteArrayOutputStream 自動擴容:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int n;
while ((n = in.read(buffer)) != -1) {
    baos.write(buffer, 0, n);
}
byte[] result = baos.toByteArray(); // 自動產生適當大小陣列

優勢:無需預知長度,記憶體管理自動化,程式碼最簡潔。

最佳實務:全站統一編碼配置

與其到處手動轉碼,不如在源頭統一:

  1. 頁面編碼: JSP 頁首 `<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>`
  2. 請求編碼過濾器: 全域 Filter 呼叫 `request.setCharacterEncoding("UTF-8")` (必須在第一次 `getParameter` 前)。
  3. 回應編碼: `response.setContentType("text/html;charset=UTF-8")`。
  4. 資料庫連線: JDBC URL 附加 `characterEncoding=utf8` (MySQL) 或 `useUnicode=true`。
  5. Tomcat 8+: `server.xml` `` 解決 GET 請求中文亂碼。

常見編碼對照表

字集名稱Java 標準名稱適用場景
UTF-8UTF-8國際化首選、支援所有語言
GB2312GB2312 / EUC_CN簡體中文舊系統相容
GBKGBK / windows-936擴充 GB2312、含繁體/生僻字
Big5Big5 / Big5-HKSCS繁體中文舊系統
ISO-8859-1ISO-8859-1HTTP 標準預設、單位元組西歐語

掌握編碼轉換本質,配合全站統一 UTF-8 策略,中文亂碼將成為歷史。

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