Unicode 和 UTF-8 有何區別

例子:windows

中文:   我網絡

utf-8:     EF BB BFE8 88 92google

unicode: FF FE11 62編碼

ANSI:       CE D2spa


1.UTF8 與 UTF8 + BOM的區別code

 

一個帶標籤,一個不帶標籤。utf-8

BOM是 Byte Order Mark (定義字節順序),由於在網絡傳輸中分兩種順序:大頭和小頭。unicode

UTF-8 不須要BOM來代表字節順序,可是能夠用BOM來代表編碼方式。字符「ZERO WIDTH NO-BREAK SPACE"的utf-8編碼是EF BB BF。因此若是接收者手動啊以EF BB BF開頭的字節流,就知道這個俄式UTF-8編碼了。字符串

windows就是使用BOM來標記文本文件的編碼方式。it

2.Unicode 和 UTF-8 有何區別?

舉一個例子: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標記位:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 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仍在普遍使用。劇透:一切都是爲了節省你的硬盤和流量。

相關文章
相關標籤/搜索