ASCII編碼與GBK編碼
摘自百度
ASCII ((American Standard Code for Information Interchange): 美國信息交換標准代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。
GBK編碼,是對GB2312編碼的擴展,因此完全兼容GB2312-80標准。GBK編碼依然采用雙字節編碼方案,其編碼范圍:8140-FEFE,剔除xx7F碼位,共23940個碼位。共收錄漢字和圖形符號21886個,其中漢字(包括部首和構件)21003個,圖形符號883個。GBK編碼支持國際標准ISO/IEC10646-1和國家標准GB13000-1中的全部中日韓漢字,並包含了BIG5編碼中的所有漢字。GBK編碼方案於1995年12月15日正式發布,這一版的GBK規范為1.0版。
一般情況下,我們見到的英文和數字是單字節的,以ASCII編碼,也就是說現代的GBK編碼是兼容ASCII編碼的。比如一個數字2,對應的二進制是0x32,而不是 0xA3 0xB2。那么問題來了,0xA3 0xB2 又對應到什么呢?還是2(笑)。注意看了,這里的2跟2是不是有點不太一樣?!確實是不一樣的。這里的雙字節2是全角的二,ASCII的2是半角的二,一般輸入法里的切換全角半角就是這里不同。
一個中文字符占用2字節,使用GBK編碼的半角英文,數字和ASCII是一樣的。
GBK編碼和Unicode編碼
GBK是中國標准,只在中國使用,並沒有表示大多數其它國家的編碼;而各國又陸續推出各自的編碼標准,互不兼容,非常不利於全球化發展。於是后來國際組織發行了一個全球統一編碼表,把全球各國文字都統一在一個編碼標准里,名為Unicode。
Unicode編碼和UTF8編碼
Unicode 是「字符集」 字符集:為每一個「字符」分配一個唯一的 ID(學名為碼位 / 碼點 / Code Point)
UTF-8 是「編碼規則」 將「碼位」轉換為字節序列的規則(編碼/解碼 可以理解為 加密/解密 的過程)
廣義的Unicode是一個標准,包含字符集和一系列的編碼規則,即Unicode字符集和UTF-8,UTF-16,UTF-32......
utf8是對unicode字符集進行編碼的一種編碼方式。
一下摘自知乎uuspider的回答,
舉一個例子:It's 知乎日報
你看到的unicode字符集是這樣的編碼表:
I 0049
t 0074
' 0027
s 0073
知 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
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
報 11100110 10001010 10100101
和上邊的方案對比一下,英文短了,每個中文字符卻多用了一個字節。但是整個字符串只用了17個字節,比上邊的18個短了一點點。