字元編碼是 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/32 | Unicode 的編碼實作(Transformation Format),分別以 8/16/32 位元為基本單位。 |
| LE/BE | Little-Endian / Big-Endian,多位元組儲存順序;UTF-16/32 預設 BE,但可加 BOM 指示。 |
| BOM | Byte Order Mark(FE FF 或 FF FE),置於檔案開頭標示位元組序。 |
可透過 Charset.availableCharsets() 取得完整清單,以下為常見別名:
UTF8, unicode-1-1-utf-8UTF_16, utf16, UnicodeBigUTF_16BE, ISO-10646-UCS-2, X-UTF-16BEUTF_16LE, X-UTF-16LEUnicodeLittle(含 BOM)latin1, IBM819, cp819windows-1252 (Cp1252), windows-1250 (Cp1250) 等GBK, GB2312, Big5, Big5-HKSCSstr4all 試解碼,觀察哪個編碼輸出可讀文字。characterEncoding=UTF-8、表欄位 CHARSET=utf8mb4、Java 端讀寫皆指定 UTF-8。Content-Type: application/json;charset=UTF-8,Spring MVC 設定 spring.http.encoding.charset=UTF-8。charset="UTF-8",避免預設平台編碼導致中文亂碼。掌握「字串 ⇄ 位元組陣列 ⇄ 十六進位」三者在各編碼下的轉換關係,是解決跨平台、跨語言、跨系統中文亂碼的基石。建議將上述工具類納入專案通用模組,除錯時一鍵列出所有編碼結果,快速定位問題根因。