unicode和utf8的區別

之前一直對字符的格式都沒有了解,直到昨天看了一下ngx的utf8decode函數,完全看不懂,而且近來編譯程序也遇到了很多字符格式的問題。所以就查詢了一下字符的格式具體含義,不得不說知乎真的是個好地方!!

1.二者的區別

unicode是字符的編碼格式,從u0000到u10FFFF,至少100多萬的符號表示,裏面的每一個二進制的數都唯一表示一個符號

utf8即Unicode Transformation Format 8bit。它是在unicode上層的封裝,每個符號大小有1~6字節不等。

2.爲什麼要有utf8這種格式呢?

就是因爲在網絡傳輸中使用unicode可能會浪費一些空間,因爲對於英文字符本身最多1個字節表示就夠了,但是unicode是2~3字節編碼,所以爲了節約網絡的帶寬,出現了uft8格式,對於英文字符一個字節就夠了,並且在unicode的基礎上做了一些封裝,解決了一個符號多個字節計算機怎麼識別的問題。

3.舉個例子

作者:uuspider
鏈接:https://www.zhihu.com/question/23374078/answer/65352538
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

It’s 知乎日報你看到的unicode字符集是這樣的編碼表:I 0049
t 0074
’ 0027
s 0073
0020
知 77e5
乎 4e4e
日 65e5
報 62a5
每一個字符對應一個十六進制數字。計算機只懂二進制,因此,嚴格按照unicode的方式(UCS-2),應該這樣存儲:I 00000000 01001001
t 00000000 01110100
’ 00000000 00100111
s 00000000 01110011
00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
報 01100010 10100101
這個字符串總共佔用了18個字節,但是對比中英文的二進制碼,可以發現,英文前9位都是0!浪費啊,浪費硬盤,浪費流量。怎麼辦?UTF。

UTF-8是這樣做的:

  1. 單字節的字符,字節的第一位設爲0,對於英語文本,UTF-8碼只佔用一個字節,和ASCII碼完全相同;
  2. n個字節的字符(n>1),第一個字節的前n位設爲1,第n+1位設爲0,後面字節的前兩位都設爲10,這n個字節的其餘空位填充該字符unicode碼,高位用0補足。這樣就形成了如下的UTF-8標記位:0xxxxxxx110xxxxx 10xxxxxx1110xxxx 10xxxxxx 10xxxxxx11110xxx 10xxxxxx 10xxxxxx 10xxxxxx111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx… …

於是,”It’s 知乎日報“就變成了:I 01001001
t 01110100
’ 00100111
s 01110011
00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
報 11100110 10001010 10100101
和上邊的方案對比一下,英文短了,每個中文字符卻多用了一個字節。但是整個字符串只用了17個字節,比上邊的18個短了一點點。下邊是課後作業:請將”It’s 知乎日報“的GB2312和GBK碼(自行google)轉成二進制。不考慮歷史因素,從技術角度解釋爲什麼在unicode和UTF-8大行其道的同時,GB2312和GBK仍在廣泛使用。
劇透:一切都是爲了節省你的硬盤和流量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章