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

Java 十六進制、Unicode/UTF 編碼與中英文互轉完整實作指南

     編輯:Java 程式設計入門

編碼關係速查

  • Unicode:字符集標準,為每個字符分配唯一碼位(Code Point),Java 內部 char/String 使用 UTF-16 編碼儲存。
  • UTF-8/16/32:Unicode 的具體編碼方案(Transformation Format),用於儲存/傳輸。UTF-8 相容 ASCII、節省空間;UTF-16 固定 2/4 位元組;UTF-32 固定 4 位元組。
  • LE/BE:Little-Endian / Big-Endian 位元組序,UTF-16/32 有 LE/BE 變體,BOM (Byte Order Mark) 標識序。

核心轉換工具類

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public final class HexUnicodeUtil {

    /** 字串 → 各編碼十六進制 */
    public static void strToHexAll(String text) throws UnsupportedEncodingException {
        String[] encs = {"UTF-8","UTF-16","UTF-16LE","UTF-16BE",
                         "UTF-32","UTF-32LE","UTF-32BE"};
        for (String enc : encs) {
            byte[] bs = text.getBytes(enc);
            StringBuilder sb = new StringBuilder();
            for (byte b : bs) sb.append(String.format("%02X", b));
            System.out.printf("%-12s: %s%n", enc, sb);
        }
    }

    /** 十六進制字串 → 各編碼解碼嘗試 */
    public static void hexToStrAll(String hex) throws UnsupportedEncodingException {
        byte[] bs = new byte[hex.length() / 2];
        for (int i = 0; i < bs.length; i++) {
            bs[i] = (byte) Integer.parseInt(hex.substring(i*2, i*2+2), 16);
        }
        String[] encs = {"UTF-8","UTF-16","UTF-16LE","UTF-16BE",
                         "UTF-32","UTF-32LE","UTF-32BE"};
        for (String enc : encs) {
            try {
                System.out.printf("%-12s: %s%n", enc, new String(bs, enc));
            } catch (Exception e) {
                System.out.printf("%-12s: [解碼失敗]%n", enc);
            }
        }
    }

    /** 單一編碼轉換:任意來源編碼 → 目標編碼 */
    public static String convert(String text, String fromEnc, String toEnc)
            throws UnsupportedEncodingException {
        return new String(text.getBytes(fromEnc), toEnc);
    }

    /** 取得系統支援的所有編碼名稱 */
    public static void printAllCharsets() {
        Charset.availableCharsets().forEach((name, cs) ->
            System.out.println(name + " | " + cs.aliases()));
    }
}

使用範例

public class Demo {
    public static void main(String[] args) throws Exception {
        String sample = "0 產品型號描述";
        System.out.println("=== 字串轉各編碼 Hex ===");
        HexUnicodeUtil.strToHexAll(sample);

        System.out.println("\n=== Hex 反解各編碼 ===");
        HexUnicodeUtil.hexToStrAll("30000900A74EC1548B57F753CF63F08F");

        // 實際轉換:Big5 → UTF-8
        String big5 = new String(sample.getBytes("Big5"), "ISO-8859-1"); // 模擬錯誤讀取
        String fixed = HexUnicodeUtil.convert(big5, "ISO-8859-1", "Big5");
        System.out.println("\n修正後: " + fixed);
    }
}

常見編碼名稱對照表(部分)

標準名稱別名說明
US-ASCIIASCII, cp367, IBM3677-bit 英文
UTF-8UTF8, unicode-1-1-utf-8最通用、無 BOM
UTF-16UTF_16, unicode, UnicodeBig含 BOM 自動判斷序
UTF-16LEX-UTF-16LE, UnicodeLittleUnmarked小端序、無 BOM
UTF-16BEISO-10646-UCS-2, X-UTF-16BE大端序、無 BOM
Big5Big5-HKSCS, cp950繁體中文常用
GBKcp936, windows-936簡體中文常用
ISO-8859-1latin1, IBM819西歐語言,常被誤用作單位元組透傳

實務避坑指南

  1. 檔案讀寫必須指定編碼:new String(bytes, StandardCharsets.UTF_8)、Files.readString(path, StandardCharsets.UTF_8)。
  2. 資料庫連線 URL 加上 characterEncoding:jdbc:mysql://...?characterEncoding=UTF-8。
  3. 網頁/HTTP 回應設定 Content-Type:text/html; charset=UTF-8。
  4. 日誌/控制台輸出亂碼:檢查 IDE/終端機編碼設定、JVM 參數 -Dfile.encoding=UTF-8。
  5. Base64 ≠ 編碼轉換:Base64 是二進位→文字編碼,非字符集轉換。

Java 18+ 新特性

  • StandardCharsets.UTF_8 等常數自 Java 7 起提供,嚴禁使用字串 "UTF-8" 硬編碼。
  • JEP 400:預設字元集改為 UTF-8(java.nio.charset.Charset.defaultCharset() 回傳 UTF-8),減少跨平台不一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved