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