// 字節 → 字符
String encoding = "GB2312";
byte[] gbBytes = {(byte)0xC4, (byte)0xE3}; // "你" 的 GBK 編碼
ByteToCharConverter cvt = ByteToCharConverter.getConverter(encoding);
char[] chars = cvt.convertAll(gbBytes); // 輸出 [0x4F60] (Unicode)
// 字符 → 字節
char[] uniChars = {'\u4F60'};
byte[] outBytes = cvt.convertAll(uniChars); // 輸出 [0xC4, 0xE3]
// 錯誤編碼後果
ByteToCharConverter.getConverter("ISO-8859-1").convertAll(uniChars);
// 輸出 [0x3F, 0x3F] 即 "??"
遷移陷阱:大量舊代碼依賴平台預設編碼(Windows GBK、Linux UTF-8),跨平台部署必現亂碼。強制規範:所有跨邊界 IO 操作必須顯式傳入
Charset或StandardCharsets.UTF_8。
UTF-8 以變長字節表示 Unicode 碼點:
| 碼點範圍 | 字節數 | 位模板 |
|---|---|---|
| U+0000 ~ U+007F | 1 | 0xxxxxxx |
| U+0080 ~ U+07FF | 2 | 110xxxxx 10xxxxxx |
| U+0800 ~ U+FFFF | 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| U+10000 ~ U+10FFFF | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
// Unicode: 0x4F60 = 0100 1111 0110 0000 (16位)
// 屬於 3 字節區間
// 1110 0100 10 111101 10 100000
// E4 BD A0
// UTF-8 字節序列: E4 BD A0
| 現象 | 根因 | 修正 |
|---|---|---|
| 「鍥涢┈」 | UTF-8 字節被 ISO-8859-1 解碼 | 統一指定 UTF-8 |
| 「????」 | 目標編碼無法表示源字符 | 選用支援字符集的編碼(如 UTF-8) |
| 截斷/異常 | 不完整多字節序列 | 使用 CharsetDecoder 處理殘餘字節 |
file.encoding=UTF-8Content-Type: charset=UTF-8)characterEncoding=UTF-8