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),我突然想到那樣的一句話。
如此說起來,似乎也挺不錯的。至於這之後又能夠做些什麼,那都是好好睡一覺然後再說的事了。
lukhnos :: May.24.2005 :: tekhnologia 技術或者藝術 :: 17 Comments »
17 Responses to “417、注音符號轉漢語拼音、兩個多年前的心願”
我討厭把送氣音寫成 ptk 不送氣音寫成 bdg 的漢語、通用拼音,這兩者有差別嗎?還給我威妥瑪… XD
真正能代表台灣,讓人一眼就看得出來你是台灣來的拼音名 … must be Pe̍h-ōe-jī?
And certainly ‘Kaohsiung’ should revert to ‘Takao’?
Anyway, good job done.
Dr. K,
tong-ì (POJ & KHH). kám-un! :)
高雄車站裡貼的老照片,高雄的拼音是「たかを」(takawo)… 戰前的寫法 :p
[...] 牛人是也。可惜了。 SAJAX 測試,其之二 – BobChao 試用 SAJAX 的經驗。 417、注音符號轉漢語拼音、兩個多年前的心願 – 好文。介紹的注音轉漢語拼 [...]
事實上很多詭異的學術大作早就已經在reference裡把台北拼成Taibei了(例如,第一本用英文寫成並出書的牡丹亭研究)。總有一天有人會指著Taipei說你拼錯,或是”Taipei[sic]“。 XD
法國人仍然把 Aachen 叫做 Aix-de-Chapelle ,Köln 叫 Cologne ,Beijing 叫 Pékin ,London 叫 Londre ,德國叫 Allemagne 。서울市的市民希望人家改叫他們住的地方叫「首爾」。
我們要不就是抱持輕鬆的態度看待人家怎麼拼寫我們的城市,要不就是得要堅持底線。歐洲城市名的拼法各異是因為語言差異帶來的歷史傳統(Wilhelm→William,Friedrich→Frederick,Hubert→Umberto),可是晚近的新名已經沒有這種差異了。我卻不知道「通用」或「漢語」派的人會怎麼看待 Taipei 被人改名的事。
Er, how about Tâi-pak, as I spelt in my doctoral dissertation?
Sùn-mùng ngì! Án chṳ́-se!
I think Tâi-pak is an excellent name to use. How do you write たかを in POJ? Tá-káu?
Or, to recall some stale joke, let’s not call Taipei Taipei or Taibei or Tâi-pak. But rather, let’s ask every nation who sees us as their equal (“世界上以平等待我之民族”) to write the name of our city as {Taipei, Taibei, Tâi-pak, T’ai-pei, Taipeh, Taihoku}. The reason?
QuantumRomanization superpositions.http://en.wikipedia.org/wiki/Kaohsiung#History Tá-káu, but it came from an earlier language….
[...] c OS X輸入法有卓越貢獻的朋友- lukhnos,近日在他的blog中寫了一篇注音符號轉漢語拼音的介紹,對於我這種只懂bpmf的拼音白痴來說,真是如獲瑰寶。不過 [...]
縮寫規則中有打錯字喔!
iou→iu
üen→uen
不過看不懂特例中的這些字為何是特例,若依足了縮寫規則:
技奇西翁雲無壹維文英音游
改好了,謝謝!
特例是指,有些注音符號,經過規則轉換後,會變成一個奇怪的組合,例如ㄨ -> u -> w,這時就要補成 wu 。不過「技奇西」的例子舉的不好,我已經改寫成注音符號了。
“nuxing→女性”没有这么智能啦,会打出“奴性”的,ü几乎在所有的拼音输入法都是用v代替的……
這篇文章真是只能用『精彩』來形容,好文章!^__^
有這麼優秀的同學,我該努力了~
整天在家帶小孩的Lucia留
ps:有空寄幾個字過來給我吧~找不到你…