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

Java 中文編碼底層剖析:從 Byte/Char 轉換到 UTF-8 位運算

     編輯:Java 相關知識

核心認知:Java 內核與外部存儲的編碼鴻溝

  • JVM 內部統一使用 UTF-16 (char) 表示字符
  • 文件、網絡、數據庫等外部媒介以 字節流 (byte[]) 存儲
  • 跨邊界必須顯式指定編碼進行雙向轉換

ByteToCharConverter:轉換引擎


// 字節 → 字符
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 位級編碼規則

UTF-8 以變長字節表示 Unicode 碼點:

碼點範圍字節數位模板
U+0000 ~ U+007F10xxxxxxx
U+0080 ~ U+07FF2110xxxxx 10xxxxxx
U+0800 ~ U+FFFF31110xxxx 10xxxxxx 10xxxxxx
U+10000 ~ U+10FFFF411110xxx 10xxxxxx 10xxxxxx 10xxxxxx

實例:「你」(U+4F60) 編碼演示


// 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 處理殘餘字節

最佳實踐清單

  1. 源文件統一 UTF-8,IDE 設置 file.encoding=UTF-8
  2. 網絡協議層面協商編碼(HTTP Content-Type: charset=UTF-8)
  3. 數據庫連接 URL 附帶 characterEncoding=UTF-8
  4. 日誌框架、模板引擎、序列化庫全鏈路鎖定 UTF-8
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved