#osxchat blog

2005/11/28

Cocoa 應用程式在處理連字(Ligature)時的特別處理與問題

作者: zonble

OpenVanilla 開發團隊前陣子在排除程式的問題的時候,才注意到了 Mac OS X 下各種 Cocoa 應用程式在處理「連字」功能的時候的細微的行為,細微到了平時幾乎根本不會注意。

在 「文字編輯」(TextEdit)等軟體中,「連字」這個功能位在選單的「格式」下,下面有「使用預設值」、「取消使用」、「使用全部」三個選項。其實 「連字」是個很糟糕的翻譯,一般來說,「連字」通常是對應到英文當中的「Hyphenate」這個字,所謂的「Hyphenate」,是當一個英文單字位 在段落結束的時候,因為剩下一行的空間無法容納那一個英文單字,所以將英文單字從中拆開,將剩下的部份移到下一行,中間加上連字號「Hyphen」。而這 邊所稱的「連字」,則是指Ligature。

那,什麼是Ligature?舉例來說,當我們在文書軟體或各種軟體中,將「fi」兩個字母 打在一起的時候,因為「f」字母的上方突出處,往往會與「i」字母上方的圓點重疊,而造成了一定程度的妨礙,或是不美觀。因此在 Cocoa 應用程式中,如果使用了某些字體,Cocoa 的文字 Render 引擎就會主動改變「fi」兩字的字體外型(Glyph),或是延長「f」中間的那一橫,讓那一橫與「i」下方那一豎的上方交會,或是拉長「f」的上方彎曲 處,並且省略「i」上方的原點,讓「fi」兩個字母融為一體。

在下圖中,就可以看到,在文書編輯與在 Microsoft Word 中,處理「fi」的行為是不同的。在 Word 裡頭,會將「fi」兩者分開,而在文書編輯裡,則會將兩個字母連在一起。圖中的字體分別為 Lucida Grande 以及 Times。

處理 fi 的狀況

而 根據測試的結果,在 Mac OS X 10.4 當中的字體,會將「fi」連起來者,包括:Big Caslon、Birch Std、Caflisch Script Pro、Century Old Style、Chalkboard、Chaparral Pro、Charcoal、Chicago、Chochin、Corsiva Hebrew、DecoType Naskh、Devanagari MT、Didot、Futura、Gadget、Geeza pro、Geneva、Giddyup Std、Gujarati MT、Gurmukhi MT、Hoefler Text、KufiStandardGK、Lucida Grande、Lucida Handwriting、Marker Felt、Minion Pro、Minion Std、Mshtakan、Myriad Pro、Myriad Std、Nadeem、New York、News Gothic Std、OpenSymbol、Papyrus、Poplar Std、Raanana、Sathu、Silom、Skia、STFangSong、STHeiti、STKaiti、STSong、Techno、 Thonburi、Times、Zapf Dingbats、Zapfino、Adobe Caslon Pro、Adobe Garamand Pro、Adobe Jenson Pro、Adobe Sans MM、Adobe Chancery、Adobe Symbols…等。

Apple 這樣的設計,固然可以讓編寫的文件看起來更為美觀,也讓人覺得 Mac OS X 系統在設計時的用心之處。但是,也不知道該說是 Apple 百密一疏,還是該說 Apple 自作聰明,總之,這樣的設計在遇到了中文環境的時候,就會出問題。狀況是,如果你在 Cocoa 應用程式中,要使用某些中文輸入法輸入中文,而這套輸入法的所採用的字根是英數字母—例如簡體中文的五筆輸入法或拼音輸入法,當您在輸入法緩衝區中輸入了 fi,在應用程式已經將fi兩字做了Ligature處理之後,你想要將這些字根送給輸入法,就會立刻造成應用程式 crash。

解決問 題有幾種方法,一是在應用程式中,關閉 Ligature 功能,或是在設計輸入法的時候,就不要以半型的英數文字設計成字根(例如改用全形英數字),以及,換用其他在上述列表之外的其他字體,但是看看上面的列 表,就不難發現,簡體中文的使用者特別容易遇到這樣的狀況,Mac OS X 內建的四套簡體中文字體:STFangSong、STHeiti、STKaiti、STSong,統統榜上有名。—而好像也可以這麼說,Apple 的在簡體中文字體上,也的確比對繁體中文字體來得用心。

相關的討論,請參見 OpenVanilla 錯誤回報系統上的 Ticket #13829

4 篇留言:

  • 其實有五組字都會這樣,詳情 man groff_char。

    fi
    fl
    ff
    ffi
    ffl

    作者: Blogger hollowout 發表時間: 11/28/2005 09:44:00 下午  

  • To type “” and “” as special characters, simply hold option + shift + 5 for ;
    option + shift + 6 for .
    (In North American (international English) keyboard layout.)

    作者: Blogger Antony Shen 發表時間: 12/29/2005 11:36:00 下午  

  • 這樣說來, 也許ligature翻成"黏字"會好一點.

    不過我比較好奇的是有些英文書寫體的字型原本的設計就是要讓字母接合, 這樣子的情況Cocoa又是怎麼處理的? 還是說ligature只是處理繪圖上重疊的部分, 因此這樣的設計不會受影響?

    作者: Blogger 淺光 發表時間: 8/10/2007 07:52:00 上午  

  • Cocoa Text System的確在ligature上處理的只有繪字(glyph drawing)的部份。請參考這份文件中關於ligature的部份:

    http://developer.apple.com/documentation/Cocoa/Conceptual/TextUILayer/Tasks/SetTextAttributes.html

    作者: Blogger lukhnos 發表時間: 8/10/2007 11:13:00 上午  

張貼留言

? 回前頁