從 ASCII 到 UTF-8 : 大話編碼(無心收獲卻獲益頗多呀!)

2006-01-19 10:16:59

從 ASCII 到 UTF-8 : 大話編碼
話說當(dāng)年,老美搞出了ASCII編碼,用8個bit表示一個字符,
解決了計算機存儲人類語言的問題.

要說當(dāng)時那幫人真是有點小家子氣,只顧解決英語,數(shù)字和一些簡單符號
的存儲問題,壓根就沒想過中文啊,拉丁文啊,藏文啊啥的怎么存儲的問題.

隨著計算機越來越普及,這個問題也就越來越尖銳了,總不能讓全世界人民
都使用英語吧?于是,有這么兩個組織,一個曰ISO,一個曰unicode組織,就開始
想辦法了...

unicode想的辦法比較簡單,不是1個byte不夠嘛?咱用兩個byte存,大概夠了吧?
這就是unicode 1.0 的實現(xiàn).

要說人家ISO就是大氣,也可能決策者們沒過過幾十K內(nèi)存的苦日子,
大筆一揮,不就是1個byte不夠嗎?用4個byte夠了吧?再用個幾百年也夠了吧?
這就是 ucs-4 的雛型.

隨著一些稀奇古怪的文字需要并入unicode,unicode的決策者有點冒汗了,
咱有這么多稀奇古怪的字母呢? 要不再加點, 用 2byte + 4 bit 來存吧..
那4bit做為頭,這下就又能表示很多奇怪的文字了....
這就是 unicode 2.0 的雛型

現(xiàn)在有了兩套風(fēng)格迥異的編碼方式, 到底該用那個呢?
于是 unicode 組織 和 ISO 組織 達(dá)成了協(xié)議,就是你中有我,我中有你,
ucs-4 盡管有 32 bit 編碼空間,只用 20 bit ,和 unicode 保持統(tǒng)一,unicode不作修改
這就是 ucs-4 和 unicode 2.0 了,狼狽為奸的結(jié)果 :)

后來在 2000 年 8 月 ,unicode 的工作人員為了顯得自己不是吃白食的,
就小小修改了一下 unicode 2.0 的文檔,做為unicode 3.0 發(fā)布了.沒加一個新字符啊!!!!!!
(實際上, 有大約12種當(dāng)前語言 和 數(shù)十種古代語言,如雅瑪語,古希臘B類線形文字,
古波斯碶型文字還沒有得到支持)


至此,編碼方案算是統(tǒng)一了,接下來,咬牙切齒罵街的就變成程序員們了.
程序員的憤怒是有道理的,比如輸入一篇100字的英文文章,如果用ASCII
編碼,僅需要 100 byte ,而如果出現(xiàn)了哪怕一個古怪的字符而不得不用ucs-4 ,
就需要 400 byte ! 這對早期的程序員來說簡直是災(zāi)難...就算對帶寬有限得今天,
這也是個很重要得問題..

于是IETF推出了 UTF- 8 和 UTF-16 兩種解決方案 (utf32用的太少,忽略)

utf 8 實際上是最聰明的編碼方式,簡單說,規(guī)則有三條
(1) ASCII 編碼不變, 用 1 個byte 表示
(2) 一個 byte 不夠 ,就用兩個 byte
(3)兩個還不夠,就用三個byte,什么?還不夠?
不可能,3個byte已經(jīng)超過unicode 的表示極限了..你是外星人嗎?

它帶來了如下兩大好處:
(1)平臺無關(guān)性,windows下用UTF-8寫的小說,別人在unix下照樣能看..
(2)有標(biāo)記位,一個字讀不出來,不影響其他字.

utf 16 則是給笨一點的程序員準(zhǔn)備的,簡單說,規(guī)則有兩條
(1) unicode 1.0 中的字符完全照搬 ,用2個byte
(2) unicode 2.0 繼續(xù)照搬,   需要用 20 bit 表示的字符,用 2byte + 4bit 處理.

這下帶來的可不是一點兩點的壞處,
(1)由于是變長,且不按計算機字長(8bit)來變長,所以用utf16編碼的
東東的解碼就和CPU,操作系統(tǒng)的處理方式相關(guān)了,不利于交流
(2)一些本來具有特殊意義的字符無法被計算機正常處理
(3)以上兩條就可以判它死刑了...其他害處不一一列舉,

但是utf16最省空間倒是真的.畢竟是緊湊編碼的,沒有大段大段的000000000出現(xiàn)....

實際上,IETF比較希望UTF-8成為事實標(biāo)準(zhǔn)(RFC2279),
而UTF-16,也就是賣ISO和unicode個面子,實現(xiàn)一下而已(RFC2781)


而現(xiàn)實中,由于UTF-8的優(yōu)異性能,得到了廣泛的認(rèn)可和使用.
比如現(xiàn)在大紅大紫的XML,在XML1.0第二版規(guī)范中明確指出,
當(dāng)用戶沒有指定XML文檔的 encoding 屬性的時候,自動使用
UTF-8編解碼
(盡管我強烈建議大家注明 encoding 屬性)


OK,大話結(jié)束!各位可以把西紅柿,雞蛋啥的扔上來了 :)