Java中Unicode字符集和UTF8,UTF16編碼


Unicode和UTF16

Unicode是字符集,但是Unicode不規定如何存儲,即到底幾個字節為一組對應一個字符;
UTF16是Unicode字符集的一種編碼方式,通過”提示位“標識幾個字節編為一組,這樣就可以實現字符的存儲和讀取了;
位於 D800~0xDFFF 之間的 Unicode 編碼是特別為四字節的 UTF-16 編碼預留的,所以不應該在這個范圍內指定任何字符。如果你真的去查看 Unicode 字符集,會發現這個區間內確實沒有收錄任何字符。
基本轉換步驟如下:
將代碼點減去 0x10000,僅保留低 20 位;
將高 10 位加上 0xD800,得到高代理;
將低 10 位加上 0xDC00,得到低代理;

Java程序內部使用UTF16編碼

Java程序在內存中使用UTF16編碼轉換字符為數字進行存儲,所以char類型可以隱式轉換為int;

int n = '你';
System.out.println(n);
// 20320
System.out.println(Integer.toHexString(n));
// 4f60
System.out.println("\u4f60");
// 你

但隨着unicode字符數量增加,2字節已經不夠了,所以char類型16位長度無法表示所有字符,很多字符需要用兩個char來表示

UTF8編碼

編碼方式指的是如何將字符轉化為字節,同時將字節轉化為字符;
UTF8也是一種,將Ascii碼字符轉為1個字節,將漢字轉為3個字節,通常存儲和傳輸用的比較多。

Java的getBytes()

Bytes是8位整數,getBytes()即將字符通過UTF16編碼為數字然后拆成8位Byte字節數組,Bytes是有符號的,所以會有負數。

 for (Byte b:"你".getBytes()) {
     System.out.println(b);
 }
 // -28
 // -67
 // -96


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM