轉(zhuǎn) Unicode是什么.
析Unicode和UTF-8
1.????? 各地的方言
首先說明一下現(xiàn)在常用的一些編碼方案:
1.???????? 在中國,大陸最常用的就是 GBK18030 編碼,除此之外還有 GBK , GB2312 ,這幾個(gè)編碼的關(guān)系是這樣的。
n???????? 最早制定的漢字編碼是 GB2312 ,包括 6763 個(gè)漢字和 682 個(gè)其它符號(hào)
n???????? 95 年重新修訂了編碼,命名 GBK1.0 ,共收錄了 21886 個(gè)符號(hào)。
n???????? 之后又推出了 GBK18030 編碼,共收錄了 27484 個(gè)漢字,同時(shí)還收錄了藏文、蒙文、維吾爾文等主要的少數(shù)民族文字,現(xiàn)在 WINDOWS 平臺(tái)必需要支持 GBK18030 編碼。
按照 GBK18030 、 GBK 、 GB2312 的順序,3種編碼是向下兼容,同一個(gè)漢字在三個(gè)編碼方案中是相同的編碼。
?
2.???????? 臺(tái)灣,香港等地使用的是 BIG5 編碼
3.???????? 日本: SJIS 編碼
2.????? Unicode
如果把各種文字編碼形容為各地的方言,那么 Unicode 就是世界各國合作開發(fā)的一種語言。
在這種語言環(huán)境下,不會(huì)再有語言的編碼沖突,在同屏下,可以顯示任何語言的內(nèi)容,這就是 Unicode 的最大好處。
?
那么 Unicode 是如何編碼的呢?其實(shí)非常簡單。
就是將世界上所有的文字用2個(gè)字節(jié)統(tǒng)一進(jìn)行編碼。可能你會(huì)問,2個(gè)字節(jié)最多能夠表示 65536 個(gè)編碼,夠用嗎?
韓國和日本的大部分漢字都是從中國傳播過去的,字型是完全一樣的。
比如:“文”字, GBK 和 SJIS 中都是同一個(gè)漢字,只是編碼不同而已。
那樣,像這樣統(tǒng)一編碼,2個(gè)字節(jié)就已經(jīng)足夠容納世界上所有的語言的大部分文字了。
UCS-2 與 UCS-4
Unicode 的學(xué)名是 "Universal Multiple-Octet Coded Character Set" ,簡稱為 UCS 。
現(xiàn)在用的是 UCS-2 ,即2個(gè)字節(jié)編碼,而 UCS-4 是為了防止將來2個(gè)字節(jié)不夠用才開發(fā)的。 UCS-2 也稱為基本多文種平面。
UCS-2 轉(zhuǎn)換到 UCS-4 只是簡單的在前面加2個(gè)字節(jié) 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 個(gè)輔助平面,由原先的 65536 個(gè)編碼擴(kuò)展至將近 100 萬編碼。
3.????? 兼容 codepage
那么既然統(tǒng)一了編碼,如何兼容原先各國的文字編碼呢?
這個(gè)時(shí)候就需要 codepage 了。
什么是 codepage ? codepage 就是各國的文字編碼和 Unicode 之間的映射表。
比如簡體中文和 Unicode 的映射表就是 CP936 ,點(diǎn) 這里 查看官方的映射表。
以下是幾個(gè)常用的 codepage ,相應(yīng)的修改上面的地址的數(shù)字即可。
codepage=936 簡體中文 GBK
codepage=950 繁體中文 BIG5
codepage=437 美國 / 加拿大英語
codepage=932 日文
codepage=949 韓文
codepage=866 俄文
codepage=65001 unicode UFT-8
?
最后一個(gè) 65001 ,據(jù)個(gè)人理解,應(yīng)該只是一個(gè)虛擬的映射表,實(shí)際只是一個(gè)算法而已。
?
從 936 中隨意取一行,例如:
0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
前面的編碼是 GBK 的編碼,后面的是 Unicode 。
通過查這張表,就能簡單的實(shí)現(xiàn) GBK 和 Unicode 之間的轉(zhuǎn)換。
?
4.????? UTF-8
現(xiàn)在明白了 Unicode ,那么 UTF-8 又是什么呢?又為什么會(huì)出現(xiàn) UTF-8 呢?
ASCII 轉(zhuǎn)換成 UCS-2 ,只是在編碼前插入一個(gè) 0x0 。用這些編碼,會(huì)包括一些控制符,比如 '' 或 '/' ,這在 UNIX 和一些 C 函數(shù)中,將會(huì)產(chǎn)生嚴(yán)重錯(cuò)誤。因此可以肯定, UCS-2 不適合作為 Unicode 的外部編碼。
因此,才誕生了 UTF-8 。那么 UTF-8 是如何編碼的?又是如何解決 UCS-2 的問題呢?
例:
E4 BD A0 11100100 10111101 10100000
這是“你”字的 UTF-8 編碼
4F 60 01001111 01100000
這是“你”的 Unicode 編碼
?
按照 UTF-8 的編碼規(guī)則,分解如下: xxxx0100 xx111101 xx100000
把除了 x 之外的數(shù)字拼接在一起,就變成“你”的 Unicode 編碼了。
注意 UTF-8 的最前面3個(gè) 1 ,表示整個(gè) UTF-8 串是由3個(gè)字節(jié)構(gòu)成的。
經(jīng)過 UTF-8 編碼之后,再也不會(huì)出現(xiàn)敏感字符了,因?yàn)樽罡呶皇冀K為 1 。
?
以下是 Unicode 和 UTF-8 之間的轉(zhuǎn)換關(guān)系表:
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 編碼轉(zhuǎn)換到 UTF-8, 簡單的把 Unicode 字節(jié)流套到 x 中就變成 UTF-8 了。
posted on 2006-03-21 21:26 原語 閱讀(473) 評(píng)論(0) 編輯 收藏