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

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),我突然想到那樣的一句話。

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

試譯阿波林奈爾的〈旅館〉

阿波林奈爾(Guillaume Apollinaire,1880-1918)是我相當喜歡的一位法國詩人,最有名的作品要屬〈米哈波橋〉(Le pont Mirabeau):「在米哈波橋下 / 流走著塞納河的水 / 和我們的愛」,收於詩集《酒》(L’alcool)中。

〈旅館〉(Hôtel)是阿波林奈爾的一部短篇作品,試譯如下:

Ma chambre a la forme d’une cage
Le soleil passe son bras par la fenêtre
Mais moi qui veux fumer pour faire des mirages
J’allume au feu du jour
Ma cigarette
Je ne veux pas travailler
Je veux fumer.
我的房間有個像牢籠的形狀
陽光的手臂從窗邊溜過
而我卻想抽煙來製造幻霧
我用白日的火光
點亮我的煙
我不想工作
我想抽煙

有人在網頁上評論:「嗯,這首詩似乎不太政治正確,抽煙啊……」

Continue Reading »

試譯 Que reste-t-il de nos amours (我們的愛情還剩什麼)

Charles Trenet 作詞,Léo Chauliac 作曲,1942
唱過該曲的歌手除 Trenet 本人,尚有 Dalida (1972), Patrick Bruel (2002)
原文連結

Continue Reading »

採用語料庫編成的詞典

Corpus 在語言學上的意思是「語料」,corpus-based dictionary 則是「使用語料所編出來的詞典」。在英語學習上,Collins 以 COBUILD (全名為 Collins Birmingham University International Language Database)所編彙出的一系列 Learner’s Dictionary 可能是最早使用語料,並針對第二外語學習者所編彙的英語詞典。

這本字典的第一個版本,大約是在我唸書的時候出現的。還記得那時候許多剛從國外回來、特別是英語教學專長的老師,都紛紛推薦這套詞典。

我大約是在頭一次聽到這套字典後一年,看到有同學在用了,才去買了一套。先前我用的是 Longman 一本 1990 年代初期所編的英英-英漢雙解詞典,難字則配合 American Heritage 使用。Collins COBUILD 給了我完全不一樣的使用經驗。

所謂 corpus-based dictionary ,跟不是 corpus-based 的字典,最大最大的差別,就是使用上的感覺:傳統的詞典最大的問題,在於常常要找什麼沒什麼,特別在口語表達方式、例句、流行語這三種面向上。這當然跟傳統詞典編輯的方式有關。傳統詞典過去一直仰賴編輯委員會的組成,以及資料收集、整理的功力。這中間反應了編輯委員會的學識涵養,以及相當大一部份的人為偏壓(bias)。例如許多老字典的例句,可能來自經典文學、劇本、散文,以致於例句往往落後字詞的通行意義,有時甚至可能達百年以上的差距。

然而像 Collins 詞典就很不一樣。我到目前為止,幾乎還沒遇過哪個寫作上的字義問題,是 Learner’s Dictionary 找不到的。

Continue Reading »

John Updike 評論村上春樹

村上春樹的近作《海邊的卡夫卡》出英譯本了, *New Yorker* 雜誌刊載了由 John Updike 所寫的評論。雖然情感上讀中譯本,據說比較能撿拾出日文的味道,但是理智上覺得,在村上在中文譯界儼然是種工業的情況下,我還是寧願花一倍以上的時間去讀英譯本。

脫隊

一個人走在午夜場過後的電影院大廳內,從鋪著地毯的樓層搭手扶梯走下來,空蕩蕩的感覺讓我想起那時在加拿大的事。

那是第一次出國。說是要參加比賽,到了結果發表的時候我們才知道原來只是受邀觀摩。我似乎早就知道,整件事情從來不以為意。但那時帶隊的教授很認真地叫我們做好,還煞有其事地要我們排練評審來時該怎麼介紹自己的作品。

要去,還是不去,一開始我其實是很猶豫的。還有六個禮拜就要大學聯考,坐飛機回來的第二天就是學校的期末考試。為了考試,我因此決定不參加排定的歡送會。本來我們這邊還安排了幾天的旅遊行程,花的是公家的錢。和我同行的另一位同學,那時已經保送上他想唸的科系。而我當時沒有。成績一直不好的我,去這一趟,會不會更是一敗塗地,我從來沒有把握。結果,竟然是父親一句「去吧,去開開眼界,見見大世界,這樣回來,就算考得不好,你也學到考試學不到的東西了」,把我送上了飛機。

多倫多北邊的小鎮,一所以農學院和餐飲管理出名的公立學校。五月的安大略省還很冷,晚上穿上了厚外套還覺得涼意。學校招待我們住在學生宿舍,因為有餐飲管理科系,宿舍的安排一切照旅館規格,樓下還有個交誼廳。我在交誼廳第一次認識說法文的人,有人拿著原文的《小王子》在讀。來自魁北克的中學生們大聲聊天、唱歌。那是魁北克獨立公投的前一年,他們到哪裡都不忘揮舞魁北克旗。不管是去尼加拉瓜瀑布一日遊的時候,還是去多倫多的Sky-Dome看球賽,只要有人拿出旗子,就有人跟著喊:Québécois! Québécois! (魁北克人!魁北克人!)我著迷了,這群說著我不懂語言的人,這個講兩種語言的國家。車子開在高速公路上,往北望去是一片平原,除了幾座孤伶的山,印象中幾乎就是地平線。如此寬闊的地方。

這趟旅程從一開始,我就是脫隊的小孩。陪我們一起到多倫多機場的那位辦事員先生,傻呼呼以為機場查驗護照櫃台,人比較少的那一排會通關得比較快。我說,「上面英文寫著『加拿大公民入境窗口』」,旁邊大排長龍的櫃檯才是外國人該走的。辦事員先生不聽,他說,「唉呀,還不是都一樣,幹嘛排那麼長的隊」。

結果我在出境大廳,等了他們快一個小時。他們被警察留了下來,還找來移民局的人,移民局找來翻譯,弄了半天才知道他們純粹只是外國訪客,不是要移民或意圖不軌。多倫多機場雖然有「歡迎來到多倫多」的粵語廣播,講國語的人員卻幾乎沒有。

我的缺乏群性大概在這些事情上一覽無疑。後來教授和我們會合,在比賽/觀摩正式開始的前一天下午,他要同學和我先行準備。我覺得沒什麼好做的,結果在大學內的禮品店流連,還跟擔任地陪的港裔女孩聊天。後來被同學急忙叫回教授的宿舍,他勃然大怒:「你不要以為自己英文講得好,就可以到處亂跑了,我跟你說,你還差遠了…… 像你這樣桀傲不馴,我帶學生這麼多年,還是第一次見到,你們學校怎麼會出這種人…… 你看著辦,這些事我都會寫在出國報告裡。」

不知道為什麼,那時候心裡面覺得,被人家劈頭這樣罵,還覺得蠻驕傲的。論學業才智,我不如他所帶過的優秀學長們。論個性乖僻、難搞古怪,可以被他說是多年首見,我竟然還頗以為這是種恭維。

狂飆歲月,那一次我嘗了甜頭。後來的日子幾乎像是孫悟空離不開更大力量的手掌心,越是想要掙脫,越是被家、學校、人情冷暖給整得慘。很久之後有機會遇見同樣有著狂飆溫度的人,才學會原來輕狂是要付出代價的,做自己想做的事是要動更多心思的,幾乎要那種尤里西斯式、Stephen Daedalus的狡慧,才可能全身而退,保持原樣地活下去。

給教授載到多倫多機場的路上,他們蠻緊張的。他們不是很放心讓一個還未滿18歲的小毛頭,就這樣一個人進機場坐飛機回國。他們也似乎是第一次得面對、處理這樣的事。下車的時候,教授還是祝福我聯考順利,還問我有沒有台灣的電話,不管有任何問題,一定要趕快打回台灣。不管基於禮貌、風度還是什麼。如今再想,對他來說,我也不過就是個高中生的孩子,而過往他眼前來來去去的耀眼明星多了,不差我這一根不甚出色又行徑古怪的小草。我也還是感謝他的風度、他對我的容忍,還有畢竟是老師的關心。

一個人進機場,用著粗淺的英文,check-in、通關、繳機場稅。結果那位收錢的先生在我機票上蓋了章,跟我說:「今天是你的幸運日,算你便宜點,好啦,你可以走了」,然後比了個可以走了的手勢。「不用付錢?」「嗯嗯。」

在候機大廳的免稅商店拿了退稅申報單,買了一客簡單的早餐。拿出放在隨身行李中的物理講義,卻怎麼樣心思都放不在那上面了。

後來的事其實都不那麼重要了。我還是乖乖地考了聯考,暑假快結束時去給人剃了頭,換得一身臭回到大一開學後的學校。五月的多倫多像一場夢一樣,我說服我自己,那般狂暴的日子已經結束了,那些都只是聯考前的不該發生的插曲。

一直到很多年後我才明白,有些事情改變了就不會回頭的。脫隊,或者一個人來去遠方,或者就是沒辦法照著原先以為的方法當個跟大家一樣的人…… hey, it’s already in your blood.

或者也可以說:It’s always in your blood.

香草輸入法0.06版新增倉頡、簡易輸入法

一開始開發香草輸入法,是為了能在Mac OS X上用倚天排列打要選字的傳統注音。0.06版的香草輸入法,則加入了倉頡和簡易輸入法。(注音輸入法一直是支援傳統排列的)。在使用者介面上,除了感謝Zonble提供的香草logo,所有的功能終於都可以在輸入法選單裡選取了。不再有煩人的CTRL-OPT-I和CTRL-OPT-K組合鍵了。

vanillainput006-screencapture.jpg

由於我一直使用注音輸入法,「香草」在注音上若是有任何缺陷或我不滿的地方,修訂的速度一定比較快。我不知道「香草倉頡」或「香草簡易」是否能符合這兩種輸入法使用者的需要,如果您有任何想要增加的功能,或是發現了任何急於修正的軟體缺陷,請不吝和我聯絡,或者(更建議您)試試看OpenFoundry的回報系統來參與軟體的bug tracking和功能討論。

您可以在這個頁面中取得香草輸入法0.06版

在發佈0.05 preview版的時候,我說0.05版應該是最後一個奠基於Apple BasicInputMethod(BIM)的版本了。我這陣子除了忙於工作,也花了時間在研究如何將BIM重寫成C++的版本。只是最近時間實在有限,0.06版的許多功能添加,幾乎是在一種令人快崩潰的絕望中完成的,程式碼已經亂到慘不忍睹了,尤其是BIM顯然是舊時代(ancien régime)的產物,很多時候,我只能把所有程式碼丟在一起,然後祈禱能執行(often, I was so desperate, that I could only throw all codes together, and pray that they would compile)…… 看起來最早在一些地方下工夫還是值得的,至少注音模組一直都相當地穩定。不過,如果香草還要再繼續發展下去,一定不能再這樣胡亂堆程式碼了。Refactoring in urgent need!

最後希望在這裡和大家討論一個問題,那就是香草要怎麼加入香港字集、甚或是簡體字的支援?因為,Apple的Carbon模組,內部的Unicode支援,只有UTF-16,然而,許多香港字集(BIG5-HKSCS)對應到Unicode時,卻是在字碼0×10000以外的字(也就是4-byte的UTF-8 code)。當然,另一個我很想加入的功能,是使用者自訂輸入法資料,甚至,是仿傚xcin,寫做一套「通用輸入法模組」,這樣一來,xcin的大易、行列等資料檔,應該就都可以拿來利用了……。

喔,對了,這篇blog同時載於#osxchat blog這個園地,歡迎大家一起來分享OS X的使用經驗、參與OS X的相關討論!

香草輸入法0.05(preview release)

香草輸入法0.05版可以從Open Foundry下載取得

其實這個程式一直沒有固定的中文名字。我自己經常在「香草輸入法」和「香草注音輸入法」之間變換。不過,這個preview release的0.05版(2004/7/31)或許真的可以稱為「香草輸入法」或者就簡稱「香草輸入」了。不不,我並沒有真的「研發」了什麼新的輸入法,只是在0.05版裡,把倉頡輸入法加了進去,而且可以穩定運轉了。

那麼,這樣的模式既然被證明行得通,要再加入新的輸入法,應該難度(difficulty)不會更高。現在的問題是複雜度(complexity)和藕合度(coupling)。這樣就涉及到一個問題,即現有的「香草」,仍然是在匆忙草率的狀況下寫完的。我一直沒有擺脫「對Apple Developer Connection提供的Basic Input Method做最小補丁修改」的原則。如果「香草」要繼續長大,那麼架構上勢必要有一番重整,包括有很大一部份程式,等於要scrape(作廢丟棄)掉,重新寫過。這種感覺就跟辛苦寫完兩萬字中篇,才發現一開始的人物心理狀態就錯了,走不到尾巴,最後只能全部重寫一樣(我沒有太多其他類型的藝術經驗,只能拿寫作作為類比),對任何一個作者來說,這絕對都是極痛苦的決定。我一個禮拜以來沒有再對「香草」做什麼新動作,除了(感謝老天!)嚴重的bug幾乎沒有,因此沒有新的debugging要做之外,一方面也是我自己在拖延這件應該要做的事。

講完了感想,竟然還沒講怎麼使用。我多了一個功能鍵,CTRL-OPI-I是用來切換注音/倉頡的。這一版「香草」的倉頡輸入法資料,同樣取材自xcin的cj.cin。xcin的倉頡輸入法據朋友b6s的分析,應該是第三代倉頡(「香草」下載區的emucj.zip有個小perl程式,可以用來敲入倉頡鍵碼,來搜尋cj.cin的內容,同時敲進第三代和第五代的倉頡碼,只有第三代有搜尋結果)。再怎麼說,這應該都比OS X內建的倉頡輸入法要來的合理得多。根據mjhsieh轉來的資料,OS X的倉頡雖然可以用五代倉頡碼輸入字,但竟還保留了許多早年不可思議的特色,像是用「重」字碼來挑選重覆字等等(我不會倉頡,這裡講的細節可能有誤)。Autrijus和我作一偈云:「牧遙宣宣岸,倉頡重重難」,希望「香草倉頡」能為大家減輕一點「重重難」。

必須要說的是,xcin的cj.cin,是有包括香港Big5延伸字集的。但是我發現Perl的piconv似乎沒辦法把香港字集的字,完整地轉成UTF8。這個問題我還不是很瞭解原因在哪裡。目前的處理是,香草完全不用cj.cin後半部的香港字集,意思是說香草的倉頡只能打出台灣在用的Big5繁體字而已。

對於真正需要倉頡輸入法的朋友,CTRL-OPT-I當然是行不通的。因為每進一個新應用程式就得重設一遍輸入法(雖然一旦設好之後,在離開該應用程式前,設定會一直有效)。造成這樣的不便,只能說是我的偷懶。當然,一方面也更加證明了「對Basic Input Method做最小補丁」已經碰到了這個設計原則的玻璃天花板了(the glass ceiling of such design principle)。下一版的「香草」第一個要加的功能,一定會是「使用者偏好設定」。只有這樣才能一勞永逸解決切換輸入法的問題。

因為CTRL-OPT-I的問題,才想起「香草」引起了一些朋友的誤會。許多朋友一直以為「香草」只是「支援倚天排列的傳統注音輸入法」。事實上「香草」也有標準排列。當然,一方面排列必須用CTRL-OPT-K切換,同樣造成了極大的不便,另一方面,OS X裡的注音輸入法,本身就是標準排列的,這使得「香草」對於已經在使用標準排列的傳統注音使用者來說,意義不大。

倒是,有幾個地方值得努力的。例如,加入倚天26鍵和許氏注音排列,就是值得做的事情。另外,如果使用者能加字(例如我習慣的「呢」是一聲,但很多人在漢音和酷音,卻是習慣打輕聲的「呢」)、或者增補原來xcin的phone.cin的不足(例如加入「堃」這個原不在標準Big5範圍內的字),甚至,加入「用注音打簡體字」或「用注音打日文漢字」等功能…… 這些其實都只是在phone.cin資料層次上就可以解決的問題(可以用diff的方式來做patch)。但因為目前「香草」是把資料表編死,「編」進程式碼裡(這完全是偷懶和功力不足的表現),因此資料層次的擴充性很低–除非把phone.cin改完後,重新執行「香草」的mergecnv這道shell script,並重編整個程式碼。

最後講講這個”preview release”的0.05版有哪些東西。首先,在注音輸入法部份,新加入”<"和">“兩個換頁鍵,這是我從倚天中文(「飛碟一號」)以來就養成的習慣,看來真的是改不掉了。

另外,在原始碼層次上,我把注音輸入法的程式庫給拆開了,放在了vanillalib_phone這個目錄。倉頡輸入法則放在vanillalib_cj這個目錄。有了注音輸入法的經驗,倉頡的程式庫有了較新的設計。「香草」的倉頡(或許可以稱為「香草倉頡」)程式庫完全是以C++寫成的,在程式介面部份完全OO化–那是講好聽的說法,講難聽一點其實就只是「包裝得好看一點」。金玉其外,倉頡的搜尋部份,是用最偷懶的stdlib.h的bsearch()作完的。有了這樣的經驗,接下來要做的恐怕就是再高一層的抽象化(abstraction),例如寫作VanillaAbstractInputMethod這樣的class。哇,聽起來就很不優雅,很噁心。至於負起輸入法UI大任的VanillaEventHandler,程式還是一團糟,只能等待下一次重寫時一次清創完畢。

因為是”preview release”,相關的文件還來不及同步更新,就以這份簡單的文件,說明0.05版裡有的東西。

我實在不是個認真寫程式的傢伙,coding得少,感想卻寫了一大堆。只是覺得這是相當有趣且難得的學習經驗(必須要說是站在許多人的肩膀上)。如果沒有open source,我根本沒有機會為著自己本初的需要來「寫」一套輸入法。如果沒有open foundry,我可能得從頭建立網站、弄Wiki,而且不會有foundry那麼好的bug tracker。接下來要學的東西,除了Xcode之外,還有版本管理、研究open source licencing的問題(誠實說,一直到最近,我才真的逐條讀完GNU General Public License v2以及其Documentation License)。

最後講兩個延伸出去的話題。

首先,在clkao的提醒下,我在想IIIMF這個跨平台的輸入法計劃是個相當重要的方向,尤其該計劃的視野更大,涵蓋的輸入法不僅只有兩岸三地的中文,還有日、韓、泰文等。Clkao提到,IIIMF有”EIMIL”語言(XML-based),可以用來設計輸入法。新的輸入法應該是一個generic EIMIL processor,把使用者指定的輸入法行為翻譯出來,而不是針對各別輸入法做specific case。這個方向的確是重要的,且在X11和Windows上都有可以run的程式碼了。比較起來OS X反而是未開發的一塊地。

最後,在OS X的輸入法這邊,最近才發現到原來除了Carbon可以寫輸入法,Apple的新一代程式框架Cocoa也有自己的輸入法架構。範例程式在Xcode的/Developer/Examples/AppKit/HexInputServer,但是說明文件老舊有誤,實際執行起來,竟然只有用Cocoa寫的程式可以使用。可惜,因為Cocoa寫成的輸入法都是Objeictive-C模組,光是程式碼的漂亮程度,就比用C/Carbon寫的input component不知好上幾百倍。

這一個禮拜以來繼續有許多朋友給予他們的input, feedback與鼓勵,再次謝謝大家。

香草注音輸入法0.04版推出了

香草注音輸入法的0.04版已經發表了,從0.01版到0.04版以來,改進了許多地方不盡完美之處。核心部份則一直都很穩定。0.04版除了新增自動安裝程式(感謝Gugod提供相關知識)、改善「輸入法或視窗切換時,選字窗留駐不散」的舊問題外,說明文件也有大幅增補之處。新增的ui-schema.pdf則是從我當初分析注音輸入法的鍵盤行為草圖所整理出的文件。沒有意外或其他重大bug的話,這會是最後一個對Apple Basic Input Method做最小修訂的test run version。下一個版本將新建立Xcode project,程式碼也將有大幅整理,當然,那個小乳牛的icon也一定會換掉的。:) Zonble已經為香草注音提供了相當棒的logo design,下一版的香草注音,大家應該能看到zonble的icon design,出現在各位的桌面上。

另外我也一直在想,在後續的版本中,加入倉頡輸入法,讓「香草」能為更多被Mac中文輸入法所苦的朋友,帶來一點幫助。再次謝謝大家對香草注音的支持與協助。

香草注音輸入法發佈於OSSF的Open Foundry網站,相關訊息Wki在這裡,而軟體可由這裡下載

« Previous PageNext Page »