記得剛畢業那會兒筆試有一個題目大概是這樣的:
填寫一個漢字的各個編碼的字節數和位數:
編碼格式 | 佔字節數 | 所佔位數 |
GBK | ||
UTF-8 |
當時毫不憂慮的寫了GBK:2字節16位 ,UTF-8:3字節24位。而且在相當的一段時間裏,還覺得自己是對的,而且百度也覺得這是對,哎,無知真可怕啊!
我們都知道assic碼用的是一字節,卻只用了7位,最高位永遠爲0,其編碼範圍是:00000000 ~ 01111111。雖然後來IBM做了下擴充,使用了8位,不過貌似沒什麼人承認額!說到這裏,答案就很明顯了,一個UTF-8的漢字顯然用了3字節,但一定不是24位。
UTF-8是UNICODE的一種變長字符編碼又稱萬國碼(就是可以表示所有國家的文字的編碼,名字大氣啊!),其長度爲1字節~6字節。漢字的UTF-8編碼則是3個字節表示。UTF-8用其第一個字節的前幾位來標示其編碼寬度,具體規則如下:
1、第一字節的最高位爲0,則爲1字節寬度
2、第一字節的最高3爲110,則爲2字節寬度
3、第一字節的最高4位爲1110,則爲3字節寬度
4、第一字節的最高5位爲11110,則爲4字節寬度
5、第一字節的最高6位爲111110,則爲5字節寬度
6、第一字節的最高7位爲1111110,則爲6字節寬度
對於多字節寬度,其於後幾位最高兩位必須爲:10
因此:
字節(bytes) | 位(bits) |
表示 |
1 | 7 | 0XXXXXX |
2 | 11 | 110XXXXX 10XXXXXX |
3 | 16 | 1110XXXX 10XXXXXX 10XXXXXX |
4 | 21 | 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX |
5 | 26 | 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX |
6 | 31 |
1111110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX |
正確的答案應該是一個漢字用UTF-8表示用了3位16bit,所以不要小看任何一個面試的題目,說不定背後就有玄機!