在計算機中,所有信息最終都能以二進制字符串來表示。二進制位又叫做比特(bit),每個比特有0和1兩種狀態(tài),8個比特構(gòu)成了1個字節(jié)(byte),1個字節(jié)可以表示256種狀態(tài)。
ASCII
ASCII碼一共規(guī)定了128個字符的編碼,這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節(jié)的后7位,最前面的1位統(tǒng)一為0。
Unicode
Unicode是一個容納了上百萬字符的字符集,規(guī)定了每個字符的二進制代碼。但是沒有制定具體的存儲規(guī)則,例如當(dāng)用3個字節(jié)存儲一個字符時,它同時可以被理解為存儲了3個ASCII碼,另外我們都知道ASCII碼是用1個字節(jié)存儲,當(dāng)規(guī)定用3個字節(jié)存儲字符時,就造成了空間的極大浪費。
Unicode同時也兼容了ASCII碼。
UTF-8
UTF-8是實現(xiàn)了Unicode的方式之一,特點是變長編碼,它使用1-4個字節(jié)表示一個符號。
編碼規(guī)則:
- 對于單字節(jié)的符號,字節(jié)的第一位設(shè)為0,后面7位為這個符號的unicode碼。因此對于英語字母,UTF-8編碼和ASCII碼是相同的。
- 對于n字節(jié)的符號(n>1),第一個字節(jié)的前n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。
總結(jié)為下表,x表示字符
Unicode符號范圍 | UTF-8編碼方式
(十六進制) | (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
例:
“嚴(yán)”字的Unicode編碼為100111000100101,用十六進制表示為U+4E25,處在上表的第三行。換成UTF-8則需要3個字節(jié),二進制代碼為11100100 10111000 10100101,轉(zhuǎn)換成十六進制為E4B8A5。
參考:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html