Unicode
unicode是固定長度的字符集,最初由兩個字節共16位表示。16位最多隻能表示65536個字符。當需要表示各種語言的所有字符時,16位是不夠用的。所以unicode4.0新增了一組附加字符集,附加字符集採用兩個16位(注意,不是32位)來表示,最多可定義1048576個附加字符。
注意,unicode只是一組理論上的字符集。如果要在內存或者文件中表示字符,需要使用一定的編碼方式來表示unicode。 utf-8就是unicode的一種實現編碼規範。
utf-8
unicode算上附加字符集,需要使用兩個字節以上的二進制來表示,姑且認爲需要使用3個字節。而英文采用ASCII碼,只需要使用一個字節。如果將一個ASCII碼的文件用unicode來表示,文件大小將增加3倍,這是無法接受的。但是,一定要使用unicode,因爲unicode定義了世界各個語言的字符,全世界通用,這也是unicode的初衷。於是一個合適的編碼實現就非常重要。utf-8應運而生。
utf-8是變字節編碼,根據unicode值,其實現可能爲1、2、3、4……個字節。utf-8的每個字節的第一位都是1. 假設utf-8需要使用n個字節表示,第一個字節的前n位爲1,n+1位爲0,其他字節的前兩位爲10.其他位爲unicode的映射位。
unicode 與 utf-8的對應關係
unicode utf-8
0x00000000 - 0x0000007F 1xxxxxxx
0x00000080 - 0x000007FF 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxx
0x04000000 - 0x7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxx 10xxxxxx
utf-8中的所有x就是unicode的值。
總結utf-8字節數與unicode有效位數的關係:
1字節 —— 1-7
2字節 —— 8-11
3字節 ——9-16
4字節 ——17-21
5字節 ——22-26
6字節 ——27-31
所以,根據unicode的有效位數就能知道utf-8的字節數。
例如:漢字‘劉’的unicode值位:01010010 0001 1000
有效位數爲15位,因此對應的utf-8爲3個字節
utf-8爲:11100101 10001000 10011000
即E58898.