编码的故事
雖然編碼天天用,但是并不明白為什么會出現這么多的編碼,于是我就去知乎上看看大佬們是怎么說的。我發現原來編碼的歷史還真有趣,人們為了把地球文明的所有文字都用編碼的方式記錄下來也是煞費苦心啊。這次就把自己理解的內容簡單記錄下來,希望別人也能大概理解。以下都是摘自知乎大佬們的回答,侵立刪。
每天都要過得開心 ( ゜- ゜)つロ乾杯 !
GB2312
最開始出現的當然是ASCII編碼咯,GB2312 就是對 ASCII 的中文擴展。GB2312規定一個小于127的字符的意義與ASCII相同,但兩個大于127的字符連在一起時,就表示一個漢字,前面的一個字節(他稱之為高字節)從0xA1用到 0xF7,后面一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼里還把數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 里本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的”全角”字符,而原來在127號以下的那些就叫”半角”字符了。
GB18030
但是中國的漢字太多了,于是我們不得不繼續把 GB2312 沒有用到的碼位找出來老實不客氣地用上。后來還是不夠用,于是干脆不再要求低字節一定是127號之后的內碼,只要第一個字節是大于127就固定表示這是一個漢字的開始,不管后面跟的是不是擴展字符集里的內容。結果擴展之后的編碼方案被稱為 GBK 標準,GBK包括了GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。 后來少數民族也要用電腦了,于是我們再擴展,又加了幾千個新的少數民族的字,GBK擴成了GB18030。
中國人也真是聰明,自己搞出一套編碼標準?,F在還在被廣泛使用,主要是比較適合咱國人,在中文多的時候比較省流量啊。
Unicode
后來ISO(國際標誰化組織)的國際組織決定廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號的編碼!他們打算叫它”Universal Multiple-Octet Coded Character Set”,簡稱 UCS, 俗稱 “unicode“。需要注意的是Unicode只是一個用來映射字符和數字的標準,它對支持字符的數量沒有限制,也不要求字符必須占兩個、三個或者其它任意數量的字節。
Unicode字符集很容易找到該字符對應的二進制碼,但是反過來可能會出現混亂,假設有兩個字符:1100 1111 1111 0001 1111 0101 對應字符‘我’,一共三個字節,1100 1111 1111 0001對應字符‘你’,一共兩個字節,恰好是‘我’這個字符二進制碼的前兩個字節。計算機進行解碼時會從左向右依次讀取,當讀到1100 1111 1111 0001時它可能就停止,讓‘你’這個字符與其對應,并不是我們當初想存的‘我’這個字符,這就是一個問題。Unicode字符集中對字符的編碼是長度不確定的,其中有的字符是兩個字符,有的是三個字符,這給計算機進行解碼帶來了困難,所以我們想給每個字符對應的二進制碼前加上一個標記,讓計算機看到這個標記就知道它將要讀取幾個字節,這就導致人們引入UTF-8,它將原本的Unicode碼進行了transformation,就是給每個Unicode碼進行標記,使得讓計算機看到某個標記就知道待會要讀取幾個字節的代碼,從而避免問題發生。
UTF-8
UTF-8中,0-127號的字符用1個字節來表示,使用和ASCII相同的編碼。這意味著1980年代寫的文檔用UTF-8打開一點問題都沒有。只有128號及以上的字符才用2個,3個或者4個字節來表示。因此,UTF-8也被稱作可變長度編碼。
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
UTF-16
曾經是當定長編碼用的,大部分字符都以固定長度的字節 (2字節) 儲存,處理起來容易,這也是當初會選擇他們的主要原因。但是計劃比不上變化快,Unicode收錄的字符很快就超過了65536個。所以如果還想用定長編碼似乎只能采取UTF-32這種編碼方式了(目前Python使用)??墒沁@種方式最大的問題是即使是英文字母也要四個字節來存儲,空間浪費太大了。所以UTF-8這種變長編碼方式開始流行起來了,英文字母只需要一個字節,漢字三個字節。更古怪更稀有的字符可以用四個,五個或更多字節表示,因為使用頻率低,所以空間浪費不大。當然定長編碼的好處是可以快速定位字符,對于string.charAt(index)方法有著較好的支持。UTF-8的話,就需要從頭開始一個字符一個字符的解析才行,會慢一點。但是與查詢定位相比,順序輸出的情況更多,所以平常也不會感受到效率會比較慢。未來的趨勢是UTF-8,文件編碼是UTF-8,數據庫編碼是UTF-8,網絡流編碼是UTF-8,這樣真的能減少很多麻煩,現在想要解決編碼問題,統一UTF-8化是最佳解決方案。UTF-16卻無法兼容于ASCII編碼也是一個問題。
為什么UTF-8沒有代替GBK?
國內網站也曾經掀起過一陣子UTF-8的熱潮,小網站倒也沒什么,但幾個大型網站很快發現改用UTF-8之后流量費刷刷刷地往上漲,因為同樣一個漢字在GB2312里只有2字節,單在UTF-8里變成了3字節,流量增加50%,對于展示大量中文內容的網站來說簡直就是災難,所以過了沒多久大網站們紛紛打定主意堅守GB,包括最開始的GB2312和專門為某朱姓總理量身打造的GBK,后來一些趕潮流的又過渡到了GB18030,因為這個標準包含完整包含Unicode所有的字符集,而且對于絕大多數中文內容而言容量遠小于UTF-8。
總結
- 上一篇: 【操作系统总结】设备管理
- 下一篇: 【品牌专场】抖音背后的视频体验分析体系与