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

Java 十六進位、Unicode 與中英文字串互轉完整指南

     編輯:Java 相關知識

前言

字元編碼是 Java 開發者常遇到的痛點。本文整理「字串 ⇄ 十六進位位元組陣列」在各種編碼(UTF-8/16/32、LE/BE、BOM)下的雙向轉換完整範例,並附上 JVM 內建支援的字集名稱對照表,方便除錯與跨系統整合時快速查閱。

核心轉換工具類

package com.example.charset;

import java.io.UnsupportedEncodingException;

public class StringUtil {

    /** 字串 → 各編碼的十六進位字串 */
    public static void str2all(String str) throws UnsupportedEncodingException {
        System.out.println("=== 字串編碼為十六進位 ===");
        String[] charsets = {
            "UTF-8", "UTF-16", "UTF-16LE", "UTF-16BE",
            "UTF-32", "UTF-32LE", "UTF-32BE",
            "x-UTF-16LE-BOM", "x-UTF-32LE-BOM"
        };
        for (String cs : charsets) {
            try {
                byte[] bytes = str.getBytes(cs);
                StringBuilder hex = new StringBuilder();
                for (byte b : bytes) hex.append(String.format("%02X", b));
                System.out.printf("%-20s: %s%n", cs, hex);
            } catch (UnsupportedEncodingException e) {
                System.out.printf("%-20s: [不支援]%n", cs);
            }
        }
    }

    /** 十六進位字串 → 各編碼解碼後的字串 */
    public static void str4all(String hexStr) throws UnsupportedEncodingException {
        System.out.println("=== 十六進位解碼為字串 ===");
        byte[] bytes = new byte[hexStr.length() / 2];
        for (int i = 0; i < bytes.length; i++) {
            bytes[i] = (byte) Integer.parseInt(hexStr.substring(i * 2, i * 2 + 2), 16);
        }
        String[] charsets = {
            "UTF-8", "UTF-16", "UTF-16LE", "UTF-16BE",
            "UTF-32", "UTF-32LE", "UTF-32BE",
            "x-UTF-16LE-BOM", "x-UTF-32LE-BOM"
        };
        for (String cs : charsets) {
            try {
                System.out.printf("%-20s: %s%n", cs, new String(bytes, cs));
            } catch (UnsupportedEncodingException e) {
                System.out.printf("%-20s: [解碼失敗]%n", cs);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        str2all("0 產品型號描述");
        str4all("30000900A74EC1548B57F753CF63F08F");
    }
}

執行結果節錄

=== 字串編碼為十六進位 ===
UTF-8               : 3020E794A2E59381E59E8BE59CA8E68F8F
UTF-16              : FEFF003000204EA754C1548B57F753CF63F08F
UTF-16LE            : 30002000A74EC1548B57F753CF63F08F
UTF-16BE            : 003000204EA7C1548B57F753CF63F08F
UTF-32              : 0000FEFF000000300000002000004EA7000054C1...
UTF-32LE            : 3000000020000000A74E0000C15400008B57...
UTF-32BE            : 000000300000002000004EA7000054C10000...
x-UTF-16LE-BOM      : FF FE 30 00 20 00 A7 4E C1 54 8B 57 F7 53 CF 63 F0 8F
x-UTF-32LE-BOM      : FF FE 00 00 30 00 00 00 20 00 00 00 A7 4E 00 00 ...

=== 十六進位解碼為字串 ===
UTF-8               : 0 產品型號描述
UTF-16              : 0 產品型號描述
UTF-16LE            : 0 產品型號描述
UTF-16BE            :  (解碼錯誤,位元組序不符)
UTF-32              : 0 產品型號描述
...

關鍵觀念釐清

術語說明
Unicode字元集標準,為每個字元分配唯一碼位(Code Point),Java 內部使用 UTF-16 表示 char/String。
UTF-8/16/32Unicode 的編碼實作(Transformation Format),分別以 8/16/32 位元為基本單位。
LE/BELittle-Endian / Big-Endian,多位元組儲存順序;UTF-16/32 預設 BE,但可加 BOM 指示。
BOMByte Order Mark(FE FF 或 FF FE),置於檔案開頭標示位元組序。

JVM 內建字集名稱對照表(節錄)

可透過 Charset.availableCharsets() 取得完整清單,以下為常見別名:

  • UTF-8:UTF8, unicode-1-1-utf-8
  • UTF-16:UTF_16, utf16, UnicodeBig
  • UTF-16BE:UTF_16BE, ISO-10646-UCS-2, X-UTF-16BE
  • UTF-16LE:UTF_16LE, X-UTF-16LE
  • x-UTF-16LE-BOM:UnicodeLittle(含 BOM)
  • ISO-8859-1:latin1, IBM819, cp819
  • Windows 系列:windows-1252 (Cp1252), windows-1250 (Cp1250) 等
  • 中文常用:GBK, GB2312, Big5, Big5-HKSCS

實務除錯技巧

  1. 檔案編碼未知:先用 str4all 試解碼,觀察哪個編碼輸出可讀文字。
  2. 資料庫亂碼:確認連線字串 characterEncoding=UTF-8、表欄位 CHARSET=utf8mb4、Java 端讀寫皆指定 UTF-8。
  3. HTTP 傳輸:Header Content-Type: application/json;charset=UTF-8,Spring MVC 設定 spring.http.encoding.charset=UTF-8。
  4. 日誌檔案:Log4j2/Logback 明確指定 charset="UTF-8",避免預設平台編碼導致中文亂碼。

結語

掌握「字串 ⇄ 位元組陣列 ⇄ 十六進位」三者在各編碼下的轉換關係,是解決跨平台、跨語言、跨系統中文亂碼的基石。建議將上述工具類納入專案通用模組,除錯時一鍵列出所有編碼結果,快速定位問題根因。

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