The Old Blog Archive (Traditional Chinese), 2004-2009

Archive for May, 2005

417, Bopomofo to Hanyu Pinyin, and Two Year-Long Wishes (Part I)

417 is the number of the distictive syllables, discouting tonal differences, in the Mandarin spoken in Taiwan. 1323 if tones are counted.

What is with these two numbers?

I learned how to use Hanyu Pinyin many years ago. Way before Taiwan got trapped in the Romanization polemics. Since then I have been aware of the influences of Romanization systems upon the language we speak and write. On the other hand, Hanyu Pinyu has many upsides. Once mastered, reference books by Hong Kong and Mainland Chinese editors become instantly accessible: idiom dictionary, Chinese-English, Chinois-français, Chinesisch-Deutsch… all indexed with Pinyin. I also got the idea how I should index my Chinese documents, and even my address book got sorted that way.

Continue Reading »

417、注音符號轉漢語拼音、兩個多年前的心願

在台灣講的國語,如果不計聲調,一共有417種音節組合。如果計聲調的話,則一共有1323種。

為什麼會突然提到這兩個數字?

我在很多年前就學會了漢語拼音,那是早在台灣大開拼音論戰之前的事了。我從那時候就意識到了拼音的模樣對於語言的影響,卻也同時知道學會漢語拼音的好處:許多香港及中國大陸編的工具書,成語詞典、漢英、漢法、漢德詞典…… 一瞬間變得好用起來。自己的中文資料需要編目的時候也馬上有了現成的索引依據,甚至連地址簿要怎麼排序都有了解法。

也許因為自己很早學會漢語拼音,我對於台灣的拼音論戰,其實是很早就選邊站的(雖然因為當局者的關係,通用拼音似乎是贏得實質勝利了)。唯一一次被動搖,是台大的江文瑜老師說:拼音就跟文字一樣,看拼音的長相就知道這是哪個地方。我忘了她確實怎麼講,也忘了出處。但這句話確實是打動我的。只是,hélas,對我來說,真正能代表台灣,讓人一眼就看得出來你是台灣來的拼音名,既不是通用,更不是亂七八糟的國語羅馬字、注音二式,而是,洋人發明的、從來沒有人搞得清楚 t t’ 差別的,威妥瑪……

(請比較唐太宗:T’ang T’ai-tsung 跟當歸湯 Tang-kuei soup 的 T 的差別。)

拼音論戰討厭的地方是會被跟政治立場劃上關係。當然我完全可以理解「通用派」或至少是「反漢語派」(如果這個集合減去通用派,還不是空集合的話)的專家學者們,以文化論述或「拼音也是一種表意文字/圖象符號」的觀點,佐以身份主體性與差異性等論述,來強調台灣要有自己拼音系統的理由。不過,就像大家都認識的積丹尼(Dan Jacobson),說過一句大家都聽過的話:「我支持台灣獨立,但拜託請用漢語拼音」(引他的話並不代表我支持或不支持「苔灣都立」)。可惜漢語拼音已經貼滿了顏色,有時我也覺得好端端的 Chien-kuo South Road (或是某個同名中學)如果改成了 Jianguo South Road ,怎麼感覺就是怪怪的,更不用說 Zhongshan South Road 或 Zhongxiao East Road 了(至於那種「半漢語、半通用」──據說主要是通用,讓通用在我心中扣了相當多分──類似 Microsoft Windows API 或 Wiki/CamelCase 命名式的拼法,像是 ZhongXiao East Road 或 ZhongShan North Road ,則是愚蠢至極點──這些學者教授都不知道漢語拼音有斷字規則,對於 Xi’an 這樣可能造成模糊的字也有斷點的嗎?!)。可能只是因為從小看慣了,鄉愁使然吧。如果萬一哪天台北變成了 Taibei ,高雄變成了 Gaoxiong ,我一定會有那種亞爾薩斯人一夕之間變成得講德語的恥辱和憎惡感。那麼威妥瑪到底招誰惹誰了(Taipei和Kaohsiung都是威妥瑪式拼法)?神奇的是,「漢語派」和「通用派」竟然有共同的敵人,那就是這個由清末洋使節和語言學家(「漢學家」)所設計的拼音系統。我還記得同樣是台大老師的廖咸浩曾經在《中國時報》論壇上寫說,威妥瑪太浪費字母了,擺著 b, d, g 不用,而且許多音律不合中文習慣。威妥瑪浪費字母的問題是大家都知道的,但是廖老師大概把外文系的語言學概論給忘了,其實中文的「得」的確不是歐語的 d ,再說那堆 apostrophe 並沒那麼礙眼,說不定還蠻有異國或甚至「東方(主義)」情調的(例如荷蘭文以 apostrophe 開頭的地名,或是希伯來文/阿拉伯文的拉丁轉寫等等)。

我扯遠了。在守著不合時宜的威妥瑪,以及使用著政治不正確的漢語拼音的同時,我其實是有機會就跟人家傳傳教,說這兩種拼音的優點各是如何等等。「漢語拼音的好處之一,」我常說,「就是它幾乎和注音符號一對一對應」。

說是這樣說,但我其實從來沒有真的驗證過這個說法。我只知道除了把ㄅ換成b、ㄆ換成p,然後有少數的規則要記(例如 liou → liu)。由於每次「傳教」的時間都不長(通常旁人只是希望你趕快幫她/他把名字或地址翻成拼音,然後就去忙別的事了),我也從來沒機會窮舉這些規則。這其實不是一件好事:傳教的人怎麼可以不對自己的信仰,做一番徹頭徹尾的檢驗呢?這種東西就跟沒有自己做過一遍證明,就把命題當定理,一樣是很危險的事。

於是,心血來潮,來寫個「注音符號轉漢語拼音」的程式。

軟體工程這一門,其實是很忌諱「重新發明輪子」這回事的。當然,換個方式想,「重新發明輪子」或許是把事情搞懂、搞通、搞爛最好的方式之一。通常做過幾次之後,就會對造輪子的人充滿敬意(我因此對設計 GUI、開發文書處理軟體、草擬程式語言文法以及會做日式蛋包飯的人充滿敬意,這些當然是我以血淚換來的教訓)。當然也有像 Hacker’s Dictionary 說所謂 “toolsmith” 之流的人,專門以重新發明輪子為樂,而且「要重新發明就發明個最棒」的。兩個月前我參加了某場程式設計的集會,就聽過這樣一個強者如是說。這個人叫 Brian Ingerson (Ingy) ,Kwiki 的發明人。他自我剖析說:”My weakness? … I reinvent everything. My strength? … I reinvent everything.”

不過我的「注音符號轉漢語拼音」純粹只是個像學生做證明題般的必經之路而已。網路上能夠查的表一大堆(據說)。幹嘛花這個力氣?

還是那句老話:為了檢驗自己所說「漢語拼音和ㄅㄆㄇㄈ幾乎是一對一對應」的命題。

經過了一陣子(reads: 一個不眠的晚上)的努力,發現事實沒那麼單純,先說結論好了。如果你要把注音符號轉成漢語拼音,請照以下的步驟進行:

首先,請先將每一個注音符號,直接依下列對照表一一代換:

  • ㄅ→b、ㄆ→p、ㄇ→m、ㄈ→f
  • ㄉ→d、ㄊ→t、ㄋ→n、ㄌ→l
  • ㄍ→g、ㄎ→k、ㄏ→h
  • ㄐ→j、ㄑ→q、ㄒ→x
  • ㄓ→zh、ㄔ→ch、ㄕ→sh、ㄖ→r
  • ㄗ→z、ㄘ→c、ㄙ→s
  • ㄚ→a、ㄛ→o、ㄜ→e、ㄝ→e
  • ㄞ→ai、ㄟ→ei、ㄠ→ao、ㄡ→ou
  • ㄢ→an、ㄣ→en、ㄤ→ang、ㄥ→eng
  • ㄦ→er
  • ㄧ→i、ㄨ→u、ㄩ→ü

(ㄜ跟ㄝ竟然都轉成 e ?沒錯,由於ㄜ跟ㄝ是互斥對──沒有ㄧㄜ,ㄝ只出現在ㄧㄝ的組合──因此沒有衝突的可能。)

接著,有一些縮寫規則:

  • ien結尾的字要變成in(例如「賓」bien→bin)
  • iou結尾的字要變成iu(例如「丟」diou→diu)
  • uen結尾的字要變成un(例如「倫」luen→lun)
  • üeng結尾的字要變成iong(例如「瓊」qüeng→qiong)
  • üen結尾的字要變成ün(例如「群」qüen→qün)
  • uei結尾的字要變成ui(例如「歸」guei→gui)
  • ung結尾的字要變成ong(例如「通」tung→tong)
  • i開頭的字前面要加y(例如「醫」i→yi)
  • u開頭的字前面要加w(例如「吳」u→wu)

最後是在上述規則轉換後,剩下來的特例:

  • (ㄐㄑㄒ)j→ji、q→qi、x→xi、
  • (ㄓㄔㄕㄖ)zh→zhi、ch→chi、sh→shi、r→ri、
  • (ㄗㄘㄙ)z→zi、c→ci、s→si、
  • (翁)ong→weng
  • (雨)ü→yu、
  • (元)üan→yuan、
  • (越)üe→yue、
  • (雲)ün→yun、
  • (無)w→wu、
  • (維)wi→wei、
  • (文)wn→wen、
  • (壹)y→yi、
  • (音)yn→yin、
  • (英)yng→ying、
  • (游)yu→you

最後,漢語拼音對於ㄩ這個音,其實是設計了 “ü” 的寫法(想來應該是從德文的 ü ─ “u umlaut” 來的)。然而會衝突的只有兩個組合,nu 和 nü(努和女)、lu 和 lü (盧和呂)。因此在最後一個階段,我們把所有剩下除了 nü 和 lü 之外的 ü 換成 u 。如果是做輸入法,則 nü 和 lü 有各種處理方法,例如 Mac 和 Windows 的簡體中文是用 v (一個漢語拼音沒用到的字母)這個鍵來輸入 ü。理論上,依照簡體中文多半是以智慧選字的拼音輸入方式,在有上下文的情況下,打 nu/lu 應該還是可以分辨這是 u 還是 ü 的。例如 nuxing→女性,luren→路人(而不是「綠人」)等。

以上的規則都寫在這個目錄裡所附的 bpmf-to-pinyin.pl 裡了。有興趣一試的朋友,可以把 bpmf-list.txt 倒進這個程式裡(perl bpmf-to-pinyin.pl < bpmf-list.txt),這個程式便會產生一列三行的輸出:第一行是拼音、第二行是注音符號、第三行則是所謂「標準排列鍵盤」的鍵碼。最後這東西對做輸入法是很有用的,有在台灣打過注音的朋友應該一看就知道我在說什麼,例如「ㄓㄨˋ」的鍵碼是 5j4 ,這樣的東西。

上面便是注音符號轉拼音的規則。至於拼音能不能利用規則倒施,來轉回注音符號,我就沒試過了。

可是,這跟一開頭說的 417 個音節組合,有什麼關係?

這個數字,是在驗證以上轉換規則的過程中,意外得到的。

為了要驗證以上規則是否正確(更誠實地說,其實是為了看看還漏了哪些規則,邊驗證邊補齊),我找來了台灣通行的「注音輸入法」的 Xcin 資料表格:phone.cin (下載 OpenVanilla 傳統注音輸入法模組所使用的 UTF-8 版,改名為 bpmf.cin),以及同樣屬 Xcin 計劃的「簡體拼音輸入法」資料表格 pinyin.cin (下載 OpenVanilla 計劃收錄的、含五萬條詞庫的 UTF-8 版),看看把 phone.cin 所有的注音符號轉過去拼音,是否能對應到 pinyin.cin 的拼音表列中。

這樣的工作,要是以前對我來說,是完全不能想像的苦工。現在有了 Perl 跟 SQLite 等工具,計算是否有漏字,是否正確一對一對映、是否有重覆衝碼等問題,就變成只是動動手寫一兩行程式或一兩句 SQL 指令的事情了。經過一些驗證,以上的規則,確實可以正確地把注音符號,轉成漢語拼音,完全不需要查表。有趣的是,phone.cin 當中,這些國語裡有的字和音,是 pinyin.cin 檔案所沒有的,這並不代表這些字不在台灣不是這樣唸,僅僅代表 pinyin.cin 沒有而已:

  • ㄋㄡˋ (耨鎒嗕譨羺獳)
  • ㄉㄟˇ (得)
  • ㄧㄞˊ (崖睚啀娾)
  • ㄈㄨㄥˋ (甮)
  • ㄕㄟˊ (誰)
  • ㄈㄡˇ (否缶殕缹鴀罘芣紑剻)
  • ㄈㄧㄠˋ (覅)
  • ㄈㄛˊ (佛坲)
  • ㄔㄨㄚ (欻)
  • ㄇㄧㄡ (唒謬)

繁體中文的 phone.cin 一共有 14143 條目,扣除重覆字(破音字)則一共有 13097 字,再扣除三十七個注音符號仍有 13060 字。最早的 Big-5 內碼中文一共造 13053 字,也就是說 phone.cin 一共多了七個字,果不其然:「碁、銹、裏、墻、恒、粧、嫺」,全都是最早的 Big-5 裡所沒有的字(想來真是不可思議)。

至於 pinyin.cin 部份,扣除雙字(含)以上的詞,一共有 7300 條,6769 個字,397 種不同的音節組合。扣掉 pinyin.cin 的兩個快鍵,總共是 395 個組合。而 phone.cin 扣除 22 個 phone.cin 裡才有的字音(以上的例外,加上幾個注音符號──漢語拼音是沒有注音符號的音碼的),正好也是 395 個組合。再作兩個集合的比對,果然證實了這個轉換規則是有效且正確的。

一路做下來,算是解答了許多自己多年來的疑惑(「注音輸入法所涵括的台灣用國語裡,到底有多少個 distinctive syllable」是其中之一」)。說真的,這些都要拜工具之賜,還有最重要的,是公開的資料表格。

說來有點荒唐也有點慚愧。我竟然是大約到去年快當完兵,有一次意外地在 google 上搜忘記跟什麼有關的東西,才知道原來 Xcin 計劃一直一直是有公開的資料表格,而且排列順序和我所熟悉的倚天中文及 Windows 注音輸入法是一致的(在此之前,我對於 X-Window 上的中文輸入法,印象僅僅及於大學時代計算機中心 Sun 工作站上的 cxterm)。我的浦島太郎時代大抵如是。

倒是,還記得更早之前,MS-DOS 的時代,寫個「不進中文系統也能顯示中文」的程式,好像挺厲害的。這件事後來變得誰都會做,也就不足為奇,於是難度提高為「不進中文系統也能輸入中文」,這就有點看頭了。我還記得那個時候有一位高中學長弄了一套很炫的 GUI ,連繪圖驅動程式都是自己用組合語言寫的。尤其是「能夠輸入中文」這件事,很是令人稱奇。我記得我曾經問他,能不能跟他要這一份程式碼(後來則是問能不能要驅動程式)。或許因為是學長要拿來賺錢的程式,或者是因為學長認為我從來都沒懂過組合語言(也沒表現過「想學組合語言」所必要的虛心或誠意)吧,這件事情從來就沒有下文。那時還不時興 open source ,少數像《倚天中文技術手冊》又寫得語焉不詳(可能是我那時沒學過資料結構,當然於我讀來如希臘文──it’s all Greek to me)。早年的羨慕只能歸羨慕。

沒想到,好死不死,後來換到了 Mac OS X 上工作,竟然又被我撞上一個同樣是超過十年的想望:想要在 Mac 上用倚天排列的注音輸入法來輸入中文。我差不多同樣在那個羨慕學長的年紀就知道 Mac 的中文不會合我用,沒想到多年後竟然還是回到了這個點上。不過這一次,我知道了 Xcin 有資料表格(多虧退伍前某次放假的 google 意外)、有 gugod, zonble 那時在天天討論的 OS X 版酷音,還有 Apple 自己提供的輸入法範例──更不用說 OS X 買來就附開發工具、開發手冊這種事了。雖然 Mac 剛入手時中文輸入不太順,感覺很幹,但是想想似乎能夠靠著這些公開的資料和公開的程式碼,自己動動手來「重新發明輪子」,這樣的感覺還是蠻幸福的。若是在 Windows 上,我大概就完全無法想像要怎麼辦了(雖然幸虧 Windows 自始至終都有倚天排列的傳統注音)。

如果沒有 open source ,就是此路不通,有緣再相會了。

後來竟然就這樣一路跟朋友們做了下去,變出了一個規模不算小、有正式包裝、有 build scripts 、有 .PDF 文件、有朋友繪製的美美的 icon 、有偏好設定程式的計劃。倒是當我用程式求出 417 這個數字的那一片刻,我突然有種感覺:這陣子的狂寫程式,無非不是在把自己那段浦島太郎歲月所該寫而沒寫、該求知而未求知、該解決而沒解決的問題,給一一償還付清。原來當時的許多疑惑以及起心動念,竟然可以延續如此長長久久的一段時間,一直到現在才有那樣的時間、精力(讓我好奇過去的時間是被用到哪去了),還有勉強算是終於學會的一些能力,而得以如願。於是繞了那麼一大圈之後,我又回到了當初起了好奇心時的那個原點。T. S. 艾略特的詩:「我的開始中有我的終點」(In my beginning is my end),我突然想到那樣的一句話。

如此說起來,似乎也挺不錯的。至於這之後又能夠做些什麼,那都是好好睡一覺然後再說的事了。