歷史回顧
可能你以為我要開始談非常古老的字符集如EBCDIC之類的,實際上我不會。EBCDIC與你的生活無關(guān),我們不需要回到那么遠(yuǎn)。
回到一般遠(yuǎn)就行了。當(dāng)Unix剛出來的時候,K&R寫了《The C Programming Language》一書,那時一切都很簡單。EBCDIC已經(jīng)慚慚不用,因為需要表示的字符只有那些不帶重音的英文字母,ASCII完全可以勝任。ASCII使用數(shù)字32到 127來表示所有的英文字母,比如空格是32,字母"A"是65等等。使用7個比特就可以存儲所有這樣字符。那個時代的大多數(shù)計算機(jī)使用8個比特來,所以你不但可以存儲全部的ASCII,而且還有一個比特可以多出來用作其他。如果你想,你可以把它用作你不可告人的目的。32以下的碼字是不可打印的,它們屬于控制字符,像7表示響鈴,12表示打印機(jī)換紙。
所有的一切都看起來那么完美,當(dāng)然前提你生在一個講英文的國家。
因為一個字節(jié)有8個比特,而現(xiàn)在只用了7個,于是很多人就想到"對呀,我們可以使用128-255的碼字來表示其他東西"。麻煩來了,這么多人同時出現(xiàn)了這樣的想法,而且將之付諸實踐。于是IBM-PC上多了一個叫OEM字符集的東西,它包括了一些在歐洲語言中用到的重音字符,還有一些畫圖的字符,比如水平線、垂直線等,水平線在右端會帶一個小彎鉤,垂直線會如何等等。使用這些畫圖字符你可以畫出漂亮的框、畫出光滑的線條,在老式的烘干機(jī)上的8088電腦上你依然可以看到這些字符。事實上,當(dāng)PC在美國之外的地方開始銷售的時候,OEM字符集就完全亂套了,所有的廠商都開始按照自己的方式使用高128個碼字。比如在有些PC上,130表示é,而在另外一些在以色列出售的計算機(jī)上,它可能表示的是希伯來字母ג,所以當(dāng)美國人把包含résumés這樣字符的郵件發(fā)到以色列時,就為變?yōu)閞גsumגs。在大多數(shù)情況下,比如俄語中,高128個碼字可能用作其他更多的用途,那么你如何保證俄語文檔的可靠性呢?
最終ANSI標(biāo)準(zhǔn)結(jié)束了這種混亂。在標(biāo)準(zhǔn)中,對于低128個碼字大家都無異議,差不多就是ASCII了,但對于高128個碼字,根據(jù)你所在地的不同,會有不同的處理方式。我們稱這樣相異的編碼系統(tǒng)為碼頁(code pages)。舉個例子,比如在以色列發(fā)布的DOS中使用的碼頁是862,而在希臘使用的是737。它們的低128個完全相同,但從128往上,就有了很大差別。MS-DOS的國際版有很多這樣的碼頁,涵蓋了從英語到冰島語各種語言,甚至還有一些"多語言"碼頁。但是還得說,如果想讓希伯來語和希臘語在同一臺計算機(jī)上和平共處,基本上沒有可能。除非你自己寫程序,程序中的顯示部分直接使用位圖。因為希伯來語對高128個碼字的解釋與希臘語壓根不同。
同時,在亞洲,更瘋狂的事情正在上演。因為亞洲的字母系統(tǒng)中要上千個字母,8個比特?zé)o論如何也是滿足不了的。一般的解決方案就是使用DBCS- "雙字節(jié)字符集",即有的字母使用一個字節(jié)來表示,有的使用兩個字節(jié)。所以處理字符串時,指針移動到下一個字符比較容易,但移動到上一個字符就變得非常危險了。于是s++或s--不再被鼓勵使用,相應(yīng)的比如Windows下的AnsiNext和AnsiPrev被用來處理這種情況。
可惜,不少人依然堅信一個字節(jié)就是一個字符,一個字符就是8個比特。當(dāng)然,如果你從來都沒有試著把一個字符串從一臺計算機(jī)移到另一臺計算機(jī),或者你不用說除英文以外的另一種語言,那么你的堅信不會出問題。但是互聯(lián)網(wǎng)出現(xiàn)讓字符串在計算機(jī)間移動變得非常普遍,于是所有的混亂都爆發(fā)了。非常幸運,Unicode適時而生。
出處:
責(zé)任編輯:bluehearts
上一頁 關(guān)于字符集和Unicode的相關(guān)知識 [1] 下一頁 關(guān)于字符集和Unicode的相關(guān)知識 [3]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|