2013年4月23日 星期二

「許功蓋」的問題

節錄自http://203.64.20.7/lifetype126/index.php?op=ViewArticle&articleId=15


許功蓋是何許人? 令人頭疼的傢伙
  有人說中國人像一盤散沙,不但不團結又愛搞分化,無論在學校、公司、部隊或社會,小圈圈或小山頭林立,想要中立者很難不被人貼上標籤,一旦被歸類到哪個派系時禍福難料。台海兩岸不就是最明顯的例子,上一代的鬥爭,下一代繼續鬥,非要弄得大家頭破血流為止。
實體和虛擬都在搞分裂
  在電腦的領域裡也一樣,中文字分裂成兩大類;你有你的一套而我也自成一派,現實生活玩分裂遊戲到虛擬世界還在搞,真令老外們百思不得其解?

  常摸電腦的人都知道,台灣和香港這邊號稱自由地區的人,雖然人少卻依然堅持正統的繁體字,統領著五湖四海華人文化界,其精神多麼地偉大呀!這派中文字型編碼以"大五碼(BIG5)"為首。對岸的大陸同胞在文革前,早開始「破四舊、立四新」,所謂的四舊是:“舊思想、舊文化、舊風俗、舊習慣”這些八股東西通通要拋掉,要改革就改的徹底,繁體自筆畫多太麻煩,不符合新的標準。而四新就是指相對應的:「新思想、新文化、新風俗、新習慣」,因此,以後電腦的中文環境都受此意識型態影響,奇怪得是既然統一寫簡體中文,後來簡體中文的編碼又搞出三這種不同派系:「GB18030、GB2312及HZ」,看來中國人真是與眾不同的民族。

  相同地,自由地區的台灣及香港雖同樣都使用大五碼來號令中文字型,妙就妙在我老廣講的粵語要維持我原來語意的精神,又多增加些令台灣人看了莫宰羊的港仔字型,於是,中文字和西方文字一字一位元組的單純性更顯得複雜難懂,英美語系的ASCII Code全球通行無障礙,這也難怪啦!電腦本來就是西方所發明出來的呀!

  相形之下,台灣也單純得多,幾乎人人全用大五碼,可是,如今不是都在全球化,台灣不能搞鎖國,文字總要交流,一有交流網絡一旦離開台灣島後,問題及麻煩也跟著來了。撇開亂碼的問題不談,因為這是先天不良所致沒辦法改變,然而,麻煩的事並不侷限在簡繁中文字的轉換上,就算在台灣普遍使用大五碼環境,一樣會有後天失調的問題出現。

大名鼎鼎的許功蓋

  無論是許功蓋或是許蓋功其實只是本尊與分身的差別不同,意思是在電腦世界裡都代表一個相同問題,我想只要曾經用過"PHP+MySQL"架站過的人,幾乎是無人不知無人不曉這頭疼的傢伙,且絕對是這些架站人心中永遠的痛。仔細探究原因,你會發現,錯的人其實不該是許功蓋,而是通稱大五碼的BIG5碼,關於大五碼的歷史傳說眾說紛紜,無一定論。我們並不評論當初編碼的對錯與是非,對這歷史有興趣的讀者不妨到google搜尋"BIG5″,相信可以找到一堆資料。

  既然大五碼聽來似乎有些問題,為何目前幾乎所有的繁體中文卻又都採用此一編碼呢?在西元1983-1984年間,個人電腦正在台灣逐漸推廣,電腦上的套裝軟體也開始盛行,為了解決電腦處理中文的問題,因而制定一套中文內碼,也就是我們通稱的"BIG5碼",又稱大五碼。而經歷過這段時間的人,一定不會忘記當初倚天中文的行銷手法,在國外軟體廠商開始引進原版軟體觀念的當時,倚天中文卻反其道而行,允許校園甚至一般使用者無條件且免費複製其中文系統,因此,讓倚天中文在當時幾乎成為中文的標準,也由於倚天中文正是採用BIG5編碼,嚴格說來,也就是BIG5碼為何一直沿用到現今的主要原因了。

大五碼錯在哪裡?

  錯在編碼時沒有把美國標準資訊交換碼 ASCII(American Standard Code for Information Interchange)的控制碼摒除在外,凡是唸過計算機概論的人都知道ASCII是以位元組(byte)為單位,又1 byte=8 bits,所以ASCII最多可以編2^8=256個字元,對於只有26個字母的英文語系國家來說已綽綽有餘,但對於有幾萬字的中文絕對不夠,因此必須用兩個byte來代表一個中文字,如"中"字的編碼即是"A4A4″。然而,BIG5碼設計時為了避免與ASCII衝突,每個中文字的第一個byte僅使用 ASCII裡的高字元(129-255),但在第二個byte卻用到了部分低字元(1-128),這正是BIG5碼在日後應用上造成極大不便的最大幫兇了。

BIG5不只找php麻煩,連UNIX都倖免於難

  7C 是 ASCII 裡的 pipe ‘|’ 用過 UNIX的人應該知道它是作什麼的,舉一個簡單的例子,如果你用 FTP 上傳一個 “四.doc” 的檔名到 UNIX 作業系統 ,傳完後立刻變成 “北.doc’,我想有太多人碰過這種經驗,原因無他,中文字 “四” 的 BIG5 碼是"A57C",當 UNIX 看到 7C 時會覺得莫名其妙,上傳一個 “|” 給我做什麼?於是就自己處理掉了…

  因此,你可以想像只要是中文字第二個byte是 “7C” 的,保證也都難逃BIG5的魔掌。

許功蓋的解決之道

  一、去除程式裡出現問題那段程式碼裡的STRIPSLASHES函數,如此,除了顯示"許蓋功"時可能變成"許蓋功"之外,似乎也沒太大的問題,但是,MySQL Server的隱碼及跳脫字元問題還是存在的。

  二、使用big5_func字串處理函數集

  當你決定使用big5_func來處理時,就必須將mysql的charset也一併改為BIG5,切記千萬不可讓許、功、蓋等字放在要插入資料字串的最後面。還有一個比較嚴重的問題是,變更charset是必須重新編譯mysql的,也就是說如果你是已經運作正常的主機,必須重新安裝MySQL Server並加入 charset=big5 的參數,若如果你是租用的虛擬主機,那問題就會變得更為複雜,因為主機供應商通常不會特別因為你要使用big5_func的函數而重新去編譯他們的資料庫系統。

  幸虧得是網絡上資源浩瀚無窮,可以搜尋繁體中文OSC版本,僅針對MySQL的charset為latin1的一些修正資料。由於BIG5所造成的問題幾乎無所不在,筆者認為除非BIG5有一個完整的補救計劃,否則許功蓋將會一直困擾著所有用PHP+MySQL架站的人,相信網絡上許多熱心的高手可以來解決BIG5的問題。或者,省得這麼多的麻煩乾脆全部改採萬國碼(Unicode),值得高興的是MySQL終於從善如流接受雙字元,自 v4.1版 以上已經支援 UTF-8 編碼了,真是可喜可賀,造福華人世界呀!

附錄:
BIG5碼中容易衝碼的文字:
(請注意看你的內文是否用到了下列的字:)

ASCII(5C) == “”
A45C么 AE5C娉 B85C稞 C25C擺 A55C功
AF5C珮 B95C鈾 C35C黠 A65C吒 B05C豹
BA5C暝 C45C孀 A75C吭 B15C崤 BB5C蓋
C55C髏 A85C沔 B25C淚 BC5C墦 C65C躡
A95C坼 B35C許 BD5C穀 AA5C歿 B45C廄
BE5C閱 AB5C俞 B55C琵 BF5C璞 AC5C枯
B65C跚 C05C餐 AD5C苒 B75C愧 C15C縷
ASCII(7C) == “|”
AA7C泜 B47C揉 A87C育 BE7C魯 B27C琍
BC7C慝 C67C鸛 A97C尚 B37C逖 BD7C罵
A77C坑 B17C悴 BB7C誡 C57C疊 A67C帆
B07C院 BA7C漏 C47C辮 AB7C咽 B57C稅
BF7C糕 AC7C洱 B67C閏 C07C嚐 AD7C迢
B77C會 C17C舉 A47C弋 AE7C徑 B87C腮
C27C甕 A57C四 AF7C砝 B97C頌 C37C牘