天天看點

轉載(中文、日文、韓文編碼問題)

随着GB2312時代的沒落和中國官方強制推行的GB18030的消沉,所有人都覺得,無需置疑地Unicode一統天下的時代即将,甚至已經來臨了。

我也曾經是,現在仍舊是Unicode的推崇者。

推崇的理由很簡單——在GB2312,ASCII的時代,一個程式、一個網頁當中多種語言(除了英語之外的)無法并存。GB2312編碼的文章,在BIG5下就是亂碼;反之亦然。一篇文章中同時含有中文和日文,或者中文和法文的事情,更是難以做到。在程式中,編碼的不一緻就更可怕。你用一個函數傳遞過去一句問候,可是對方卻用了錯誤的編碼來解析你這句問候,結果就是一堆亂碼。這給開發帶來了很大的不便。

那麼,Unicode,在我眼裡理所應當要解決這些問題的。在Unicode裡面,所有語言的編碼互不沖突,是以在同一篇文章裡可以同時顯示所有語言——于是,我也毫不猶豫地在Windows程式設計中放棄了A結尾的API,全部使用W結尾的API;在網頁上編碼全都設定為UTF-8……

可是,事情真的是那樣嗎?直到最近,我才明白我想的太天真了。

仔細看看上面的兩個“直”字,就會發現它們的不同——左邊是中文中的直,右邊則是日文中的直。類似的漢字還有“才”“具”“畫”“角”“骨”等等。

在Unicode制定過程中,像上面這樣不同國家的同一個漢字(寫法上稍有差別)是否應當編碼為同一個字時, 引起了很大的争議。争議的最終結果,是上面兩個字被賦予同一個編碼。就這樣,中文、日文、韓文中的所有漢字都被搜集整理到一起,填充到Unicode編碼的0×4E00到0×9FFF的龐大block當中。這些字按照字形排列,不再區分哪個是中文字元,那個是日文字元,哪個是韓文字元,統一叫做“CJK Unified Ideographs”。

這樣做的問題就是,一個字元本身不具有了語言的屬性,它到底是中文還是日文,取決于顯示它的字型。例如上面的“直”字,如果我們用中文字型(例如SimSun, SimHei)顯示它,就會得到圖中左邊的字,如果用日文字型顯示它(如MS Gothic),就會得到右邊日文的直。

這樣做會導緻什麼問題呢?

1,無法利用文字的編碼來區分其屬于哪種語言的文字。

Unicode當中的其他語言——例如阿拉伯語,都有其固定的編碼範圍,例如阿拉伯語是0×0600到0×06FF。這樣一個字元處理軟體在處理到一個0×0600到0×06FF區間的字元時,它就知道現在在處理的是阿拉伯文。可是漢字呢?中日韓的漢字被無規律地混雜在同一個區間中,是哪國文字以無法辨認。

2,一種字型無法同時表示中文、日文和韓文

由于文字是利用字型顯示來表明它自己是哪國文字的,那麼一種字型将無法同時表示中文和日文。試想,你在創造一種字型;當你遇到“直”這個漢字時,你要麼選擇中文寫法,要麼選擇日文寫法,兩者不可兼得。

這會帶來什麼後果呢?輕一點的後果,是中日文混用寫成的文章中必須設定至少2種字型才能準确表達,因而在一些不支援混用字型的編輯器——例如Windows的記事本當中要麼中文字元變成了日語,要麼日語字元變成了中文。在日文Windows下浏覽UTF-8中文網頁的朋友,也發現那些中文字元都變成日文字元了吧(比如“骨”裡面的橫折跑到了右面)?試想這樣“錯字”連篇的中文能用在正式場合嗎?

嚴重一些的後果是什麼呢? 嚴重的後果就是,目前很多軟體,尤其是西方歐美的字處理軟體都在試圖用同一種字型滿足所有語言的需要。例如“Arial Unicode MS”字型,就是一種非常常用的Unicode字型。很顯然,在事實上這樣的字型在規定“直”字之類漢字的字模時也必須選擇中文寫法還是日文寫法。

結果不過說也知道——也許是日本在IT界的影響力高于中國,也許是什麼原因,似乎Arial Unicode MS之類的字型中凡是中日寫法不同的字型,全都是日文寫法。

換句話說,一個使用Arial Unicode MS的老外,即便他在用中文寫一篇文章,即便他用的輸入法是中文拼音,最後打出來的字元卻全都是日文漢字。 他如果是個在學習中文的人,他學到的将是這些日文漢字。更甚之,如果将來這些所謂的“标準Unicode字型”一統天下,宋體、黑體沒落的時候,中國人的電腦中的中國漢字也會不知不覺地被日本漢字取代,用電腦學習的小孩子們也會把電腦上出現的日本漢字當作漢字的正确寫法。

許多人也許會想:一定要和日本競争,争取讓标準的Unicode字型裡的漢字使用中文漢字——現在不是争不争的問題,問題是,既然中文日文中的“直”不是完全相同的漢字,為什麼不在制定其編碼階段就把它們分開呢?

我不知道Unicode是否制定了完全把中日韓三種語言孤立開的版本;我隻知道目前最流行的Unicode是像上面這樣的。 使用Unicode的諸位,請務必提高警惕。

補充:并不是所有中日文裡類似的漢字都像“直”字一樣被編為同一個編碼,例如“步”和“歩”就被分别編碼了。但是這樣的結果是,有的漢字被編為同一個編碼,有的卻沒有,更加混亂了。 

繼續閱讀