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

Java 中文亂碼終極解法:ISO-8859-1 轉碼原理與通用修正工具類

     編輯:Java 相關知識

Java 內部使用 UTF-16,但早期 Web 容器(Tomcat 5/6、Resin)預設用 ISO-8859-1 解碼 HTTP 參數,導致中文變成「???」或亂碼。核心修正原理:取得錯誤解碼後的 String → 用錯誤編碼 getBytes() 還原原始位元組 → 用正確編碼 new String(bytes, charset) 重組。

常見亂碼場景

場景錯誤編碼正確編碼修正代碼
GET 參數ISO-8859-1UTF-8/GBKnew String(param.getBytes("ISO-8859-1"), "UTF-8")
資料庫讀出ISO-8859-1GBK/UTF-8new String(rs.getString(i).getBytes("ISO-8859-1"), "GBK")
檔案讀取平台預設UTF-8new String(Files.readAllBytes(path), "UTF-8")

通用修正工具類

public final class CharsetFixer {
    private CharsetFixer() {}

    /**
     * 修正因 ISO-8859-1 錯誤解碼產生的中文字串
     * @param garbled 亂碼字串
     * @param targetCharset 目標正確編碼(UTF-8、GBK、Big5 等)
     * @return 修正後字串,若輸入為 null 回傳空字串
     */
    public static String fixISO88591(String garbled, String targetCharset) {
        if (garbled == null) return "";
        try {
            byte[] bytes = garbled.getBytes("ISO-8859-1");
            return new String(bytes, targetCharset);
        } catch (UnsupportedEncodingException e) {
            // 理論不會發生,JDK 必備編碼
            return garbled;
        }
    }

    /** 預設修正為 UTF-8 */
    public static String fixToUTF8(String garbled) {
        return fixISO88591(garbled, "UTF-8");
    }

    /** 預設修正為 GBK */
    public static String fixToGBK(String garbled) {
        return fixISO88591(garbled, "GBK");
    }
}

源頭預防:全鏈路 UTF-8 配置

  1. Tomcat server.xml:<Connector URIEncoding="UTF-8" />
  2. JSP 頁面指令:<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
  3. Filter 強制編碼:request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
  4. 資料庫連線:MySQL ?characterEncoding=utf8&useUnicode=true;Oracle 設定 NLS_LANG。
  5. IDE/編譯:專案編碼、檔案編碼、javac -encoding UTF-8 全部統一。

進階:Java 8+ 標準編碼 API

// 使用 StandardCharsets 避免字串拼寫錯誤
import java.nio.charset.StandardCharsets;
String fixed = new String(garbled.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

徹底解決中文亂碼的關鍵在於統一全鏈路編碼,工具類僅作為歷史資料搬遷或第三方介面無法修改時的補救手段。

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