| 編碼 | 位元寬度 | 特點 | 適用場景 |
| UTF-8 | 變長 1~4 bytes | ASCII 兼容(0~127 單字節),無位元組序問題,網頁/傳輸/儲存首選 | Web、JSON、XML、資料庫、Linux 預設 |
| UTF-16 | 2 或 4 bytes | BMP 字元固定 2 bytes,補字元用代理對;Java char/String 內部採用 | Java/.NET 記憶體內部、Windows API |
| UTF-32 | 固定 4 bytes | 直接索引碼位,空間浪費大,極少用於儲存/傳輸 | 內部演算法需隨機存取碼位時 |
UTF-8 變長編碼規則
U+0000 ~ U+007F : 0xxxxxxx (1 byte)
U+0080 ~ U+07FF : 110xxxxx 10xxxxxx (2 bytes)
U+0800 ~ U+FFFF : 1110xxxx 10xxxxxx 10xxxxxx (3 bytes) ← 大多數漢字
U+10000 ~ U+10FFFF : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (4 bytes) ← Emoji、生僻字
Java 中的編碼處理實戰
// 字串 → 位元組陣列(指定編碼)
byte[] utf8Bytes = "中文".getBytes(StandardCharsets.UTF_8);
byte[] gbkBytes = "中文".getBytes("GBK"); // 需捕獲 UnsupportedEncodingException
// 位元組陣列 → 字串(指定編碼)
String s1 = new String(utf8Bytes, StandardCharsets.UTF_8);
String s2 = new String(gbkBytes, "GBK");
// 檔案讀寫指定編碼 (JDK 7+)
try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8);
BufferedWriter bw = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { ... }
常見亂碼根因與排查
- 編碼不匹配:UTF-8 位元組以 ISO-8859-1 解碼 → 每個中文字變 2~3 個亂碼字元
- 雙重編碼:字串已為 UTF-8,再次
getBytes("UTF-8") → 位元組膨脹
- 預設編碼依賴:
new String(bytes) 使用平台預設編碼(Windows GBK、Linux UTF-8),跨平台部署必崩
黃金法則:所有跨邊界(網路、檔案、資料庫、JNI)的字串↔位元組轉換,必須顯式指定編碼。
GBK/GB18030 補充
- GBK:GB 2312 擴充版,收錄 21,000+ 字元(含繁體、日韓字),雙字節,與 GB 2312 相容
- GB18030:國家強制標準,單/雙/四字節混合,支援 Unicode 所有碼位,向下相容 GBK
- 上一篇文章: Java 核心知識點精華總結:從基礎類型到單例模式的 22 條實戰精要
- 下一篇文章: Java 資料庫連線池配置實戰:Tomcat JNDI 整合與 Spring 管理全流程
Copyright ©
程式碼之家 All Rights Reserved