引用web
weifeng.shen 的 字庫編碼Unicode相關知識
1. 各地編碼算法
首先說明一下如今經常使用的一些編碼方案:函數
1. 在中國,大陸最經常使用的就是GBK18030編碼,除此以外還有GBK,GB2312,這幾個編碼的關係是這樣的。編碼
n 最先制定的漢字編碼是GB2312,包括6763個漢字和682個其它符號spa
n 95年從新修訂了編碼,命名GBK1.0,共收錄了21886個符號。code
n 以後又推出了GBK18030編碼,共收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字,如今WINDOWS平臺必須要支持GBK18030編碼。orm
按照GBK18030、GBK、GB2312的順序,3種編碼是向下兼容,同一個漢字在三個編碼方案中是相同的編碼。blog
2. 臺灣,香港等地使用的是BIG5編碼ip
3. 日本:SJIS編碼ci
2. Unicode
若是把各類文字編碼形容爲各地的方言,那麼Unicode就是世界各國合做開發的一種語言。
在這種語言環境下,不會再有語言的編碼衝突,在同屏下,能夠顯示任何語言的內容,這就是Unicode的最大好處。
那麼Unicode是如何編碼的呢?其實很是簡單。
就是將世界上全部的文字用2個字節統一進行編碼。可能你會問,2個字節最多可以表示65536個編碼,夠用嗎?
韓國和日本的大部分漢字都是從中國傳播過去的,字型是徹底同樣的。
好比:「文」字,GBK和SJIS中都是同一個漢字,只是編碼不一樣而已。
那樣,像這樣統一編碼,2個字節就已經足夠容納世界上全部的語言的大部分文字了。
UCS-2 與UCS-4
Unicode的學名是'Universal Multiple-Octet Coded Character Set',簡稱爲UCS。
如今用的是UCS-2,即2個字節編碼,而UCS-4是爲了防止未來2個字節不夠用纔開發的。UCS-2也稱爲基本多文種平面。
UCS-2轉換到UCS-4只是簡單的在前面加2個字節0。
UCS-4則主要用於保存輔助平面,例如Unicode 4.0中的第二輔助平面
20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF - 26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
總共增長了16個輔助平面,由原先的65536個編碼擴展至將近100萬編碼。
3. 兼容codepage
那麼既然統一了編碼,如何兼容原先各國的文字編碼呢?
這個時候就須要codepage了。
什麼是codepage?codepage就是各國的文字編碼和Unicode之間的映射表。
好比簡體中文和Unicode的映射表就是CP936,點這裏查看官方的映射表。
如下是幾個經常使用的codepage,相應的修改上面的地址的數字便可。
codepage=936 簡體中文GBK
codepage=950 繁體中文BIG5
codepage=437 美國/加拿大英語
codepage=932 日文
codepage=949 韓文
codepage=866 俄文
codepage=65001 unicode UFT-8
最後一個65001,據我的理解,應該只是一個虛擬的映射表,實際只是一個算法而已。
從936中隨意取一行,例如:
0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
前面的編碼是GBK的編碼,後面的是Unicode。
經過查這張表,就能簡單的實現GBK和Unicode之間的轉換。
4. UTF-8
如今明白了Unicode,那麼UTF-8又是什麼呢?又爲何會出現UTF-8呢?
ASCII轉換成UCS-2,只是在編碼前插入一個0x0。用這些編碼,會包括一些控制符,好比 '' 或 '/',這在UNIX和一些C函數中,將會產生嚴重錯誤。所以能夠確定,UCS-2不適合做爲Unicode的外部編碼。
所以,才誕生了UTF-8。那麼UTF-8是如何編碼的?又是如何解決UCS-2的問題呢?
例:
E4 BD A0 11100100 10111101 10100000
這是「你」字的UTF-8編碼
4F 60 01001111 01100000
這是「你」的Unicode編碼
按照UTF-8的編碼規則,分解以下:xxxx0100 xx111101 xx100000
把除了x以外的數字拼接在一塊兒,就變成「你」的Unicode編碼了。
注意UTF-8的最前面3個1,表示整個UTF-8串是由3個字節構成的。
通過UTF-8編碼以後,不再會出現敏感字符了,由於最高位始終爲1。
如下是Unicode和UTF-8之間的轉換關係表:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Unicode編碼轉換到UTF-8,簡單的把Unicode字節流套到x中就變成UTF-8了。