注音標音OpenType Font計畫

最後編輯:2015-11-14 建立:2015-02-03 歷史紀錄

 

    BOBBY說明

BOBBY  注音符號在Web上的顯示,除了使用Polyfill處理以外,還是希望能夠通過標準化的方式在各瀏覽器上得到實作。尤其是ruby-position: inter-character的實作,幾乎讓注音在Web上的顯示只差一步,而那一步就是調號(tone mark, e.g. ˊˇˋ)該怎麼被放到注音的右側。

 

  最近在W3C i18-CJK的討論群組上開始討論這個議題,而有了比較清楚的輪廓。可以確定的是調號不屬於Layout Engine的處理範圍,而交由OpenType來實作會較佳,而最好是能做出一套僅有注音符號與調號的開源OpenType字體,具備對應的GPOS功能,能將調號放到右側去。不管是透過安裝、內嵌或者網路字型(Webfont)的方式提供,都能讓調號得以放到對的位置。

    Bobby來自Ishi Koji的推坑信
    Chen Yijun@But 的注音符號字體感覺可以直接用了http://but.tw/font/bpmfpy.html
    Xidorn Quan这个好强大,连竖排支持都不需要了,直接用字体解决全部问题。
    Bobby這我知道,但真不能什麼都用Font做掉w

 

  • 注音符號Ruby標注範例:

 

  • <ruby>我<rt>ㄨㄛˇ</rt></ruby>

 

  • 調號僅會與以下符號一併出現:ㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ,即U+3113—U+3129。
  • 調號位置請參考《國語注音符號手冊》。
  • 調號Unicode
    • 二聲U+02CA MODIFIER LETTER ACUTE ACCENT
    • 三聲U+02C7 CARON
    • 四聲U+02CB MODIFIER LETTER GRAVE ACCENT
    • 輕聲U+02D9 DOT ABOVE
  • 注音符號Unicode
    • U+3105-U+3129(即ㄅ到ㄩ)
    • 應該不用包括U+312A-U+312D
    • CHEN YU+31A0-U+31BA(方言音擴展)
  • BOBBYOpenType GPOS registered feature: "mark"
    BobbyGecko Ruby的實作者Xidorn認為"mark"較適合。
    Xidorn Quan其实我在想是不是不用任何 feature 也可以?我不是很了解字体这边一般的做法是什么,不过如果正常文本中都是这样做的话,是否也一定需要一个注册的 feature 呢?

 

    BOBBY人力需求

BOBBY熟OpenType規格與製作的Font Designer & Font Engineer。

    Audrey Tang萌典的 font engineer 是 魏藥 (medicalwei),另外 kcwu 也參與思源黑的製作
    Audrey Tang另外 BiaoDian Pro 注音字型是 ethantw 製作的,以上是萌典字體三人組~
    BobbyTwitter上已經推坑,kcwu怎麼聯絡好呢?
    Audrey Tang@kcwu 也在 Twitter 上~
    Bobby Tung也找到@But K

 

    BOBBY技術實作需求

  1. BOBBY首先,從開源字型中取出U+3105-U+3129(即ㄅ到ㄩ)、以及二聲U+02CA、三聲U+02C7、四聲U+02CB、輕聲U+02D9的Subset。
  2. 套用GPOS Feature "mark"。
  3. 當文字直排,且U+02CA、U+02C7、U+02CB三個調號前接U+3113(ㄓ)-U+3129(ㄩ)時,將調號放到符合《國語注音符號手冊》的右上角位置。
    Bobby僅需近似,不需完全符合。
    Ming-ting Yao Wei有用 fontforge 做過 0 寬度的字體,可以試著做出 0 高度的字體並且將調號移動到負字元高度…(我試著做看看)
    Bobby↑受小弟一拜。
    Ming-ting Yao Weihttp://code.newtypography.co.uk/creating-contextual-ligatures-in-fontforge/
    Ming-ting Yao Wei(我還在載思源黑體的原始 ps 檔……)
    Ming-ting Yao Wei思源黑體的字符很容易搬來搬去的,我找別套改看看 orz
  1. (可能功能)U+02D9輕聲(˙)的位置在直排中偏高,可能在U+02D9後接U+3105-U+3129時,改變Glyph成扁一點的點,以接近標準位置?
    Bobby但目前輕聲是否要標成<ruby>呀<rt>˙ㄧㄚ</rt></ruby>,即在注音符號前,還沒有定論。
    Audrey Tang當然,但無論 <rt> 怎麼標,字型照著顯示即可,標在後方的不要移到前方。
    Chen Yijun意思是「˙ㄧㄚ」跟「ㄧㄚ˙」顯示結果會不一樣嗎?
    Xidorn Quan目前初步的结论应该是这样的,不过如果有充分的理由证明由渲染引擎重排更好的话,也可以再来讨论一下。
  1. AUDREY T

 

    BUT K技術細節

  • BUT Kruby-position: inter-character 是一種橫中直的概念,瀏覽器對於 <rt> 的內容必須視為直排處理。
    • e.g. 解釋 vmtx 所規定的直排坐標,套用 vert/vrt2/vkrn 等直排特有的 feature
  • 是否需要相容於 Adobe-CNS1-x 的問題
    • 既有繁體中文OpenType字型標準是Adobe-CNS1-x,若需要相容該標準,就不能增加新glyphs。
    • 允許增加新glyphs,能得到比較多彈性:例如可準備兩組注音符號(實務上是ㄓ~ㄦ共23個),在vert/vrt2時GSUB處理,即可能用同一套GPOS敘述同時支援橫排與直排。另外可增加一個寬/高度較小的輕聲符號。
  • 原始碼中輕聲必須置於前方(˙ㄉㄜ),因為置於後方難以推算要回推幾個字元。
    Bobby Tung這一點在www-style的討論上,有提到需不需要reorder,我認為就讓輕聲放在前方,這應該沒問題。

 

    BOBBY實作回饋

    Ming-ting Yao Wei請問哪一個軟體可以支援 mark 的?我現在想要測試從 Droid Sans Fallback 跟 Roboto 弄出來的字體不知道該怎麼測試。
    Bobby我改了注音測試html範本,輕聲有套用,但二到四聲似乎沒出來,我問問Unicoder目前狀況如何:
    Bobbyhttps://www.dropbox.com/s/ld2ert8tr5hprzb/bopomofo_vert_gpos.xhtml
    Bobby然後Mark應該各瀏覽器都通用:
    Bobbyhttps://www.typotheque.com/articles/opentype_features_in_web_browsers_-_tests
    Ming-ting Yao Wei回報一下目前進度,這是在 Chrome Canary 上面測試的結果:https://www.dropbox.com/s/9eb5m63xzwlle59/Screenshot%202015-02-05%2003.21.45.png?dl=0
    Ming-ting Yao Wei目前發現 fontforge 在垂直文字「不等高」的部分處理有問題,關掉之後雖然顯示看起來比較正常,但是所有文字(包含被 mark GPOS 指令移動的調號)都會留下空白。若啟用該選項,整體的文字會被往下 shift 約一個 x-height,且 shift 的高度不等高。
    Ming-ting Yao Weifontforge sfd: https://www.dropbox.com/s/a5e2xltia6kik8j/threedu-bopomofo.sfd?dl=0
    Ming-ting Yao WeiOpenType (CFF): https://www.dropbox.com/s/q9n72yycrw2tnxl/Bopomofo3DU.otf?dl=0
    BobbyRichard Ishida開了個W3C i18n testing case: http://www.w3.org/International/tests/test-incubator/bopomofo/

 

    But Ko做了一個測試版本(Adobe-CNS1-x規格,沒有增加新字元)
    But KoChrome - 橫排正常,直排˙不正常 (Chrome 疑似在直排時無法演算GPOS的mark anchor)
    • BOBBY T補上不正常的圖片(Chrome Mac 41&43)
    But KoSafari 7.1.2 - 橫排、直排位置移動正常,但其實直排數值是亂湊的,Safari解釋直排GPOS mark anchor 的方式很詭異,目前的數值雖疑似能顯示,但意義不明。 (另外,Safari會有符號仍占用一個字寬的問題,無法克服˙)
    • Safari 8.0.5
    But KoFirefox - 似乎不支援ruby與直排....
    • Firefox nightly 39
    But Kohttps://www.dropbox.com/sh/oxumuuxx5blinc7/AABGJKRWDpAYHcfgQXtOpVbaa?dl=0
    But Ko另外,放棄使用mark feature tag。改用 kern (橫排)與 vkrn(直排)。
    But Ko因為橫排時與直排時,聲調的相對位置並不同,必須分開處理。技術上的問題,我不太可能在 mark 同一個feature裡,寫入直排、橫排兩種不同GPOS條件。
    But Ko總之目前問題在,各瀏覽器解釋GPOS的方法還不是很正常,尤其˙在直排的情況,一團亂。
    But KoFirefox 的话,可以试用最新的 Firefox Developer Edition 38,ruby 已经默认启用,直排也已大体可用,但需要到 about:config 里面启用 layout.css.vertical-text.enabled。预计将于 39 或 40 时默认开始启用直排。
    Bobby Tung現在主要問題是各瀏覽器對GPOS的定位方式,我試試Firefox Nightly(?)。
    Xidorn Quan好,Nightly 里面直排似乎好像也已经默认启用了,我昨天好像看到了签入代码,不很确定最终进去没有。不过无论如何都可以启用那个选项来启用。
    Xidorn QuanGPOS 除了浏览器以外,其他排版软件应该也有支持的?是否可以依据一个比较有意义的写法,然后让其他某个排版软件可以正常渲染出来?如果 Firefox 里面显示有异常的话可以去提 bug。主要是有参考的话大概也许会比较好,我不是很熟悉字体这块。
    Bobby Tung我也是,所以只能請 @But K 來協助。
    Xidorn Quan另外我想如果兼容性很差的话,或许可以考虑改用 GSUB 而不是 GPOS 来处理?
  • 或许可以考虑改用 GSUB 而不是 GPOS 来处理?
    Bobby Tung這要呼叫But來看看了。也看看Richard怎麼想,我在新發的信裡把Ken Lunde加了進來,聽聽他們的意見。畢竟注音的調號只確定不在ruby-position: inter-character的範圍內,我們只是在試如何處理。
  • 除了用在Ruby標音外,也包含行內的呈現?見R.I.的Test Case

 

    BOBBY TTest Case

 

BOBBY TTest Case 1: http://binb.tw/bopomofo/case01/

 

  • 文字:橫排
  • 注音:橫排
  • 嵌入字型:bpmfgpos.otf by But Ko
  • 效果:透過OpenType GPOS(本案例為'kern')調整調號位置
  • 說明:這一點在呈現上,幾乎在各瀏覽器都沒有問題,也是比較確切的成果。

 

Test Case 2: http://binb.tw/bopomofo/case02/

 

  • 文字:直排
  • 注音:直排
  • 嵌入字型:bpmfgpos.otf by But Ko
  • 效果:透過OpenType GPOS(本案例為'vkrn')調整調號位置
  • 說明:
    • Firefox請使用Nightly build並且將layout.css.vertical-text.enabled設定為True,但似乎不支援GPOS位置調整。
      • Xidorn Quan关于这一点,我询问了相关开发者,其表示由于调号字符在Unicode中的方向属性为R,根据Writing Modes标准,当text-orientation为默认的mixed时,这些字符会以sideways的方式显示,与前面注音符号的upright不同,导致textrun断开从而使GPOS失效,类似于字体fallback的情况。此处将text-orientation手动设置为upright应可解决。
        But Ko這倒是一語點醒夢中人。注音調號當時unification到這幾個歐文調號的位置上,常常顯示成奇怪的歐文˙造型不說,現在連直排都造成影響.....
        Xidorn QuanFirefox Nightly里直排的GPOS支持应该已经修复了,可以再测试一下
        Xidorn Quan另外关于调号的方向属性的问题,前一段在CSSWG上有过一些讨论 ,Koji表示可以去Unicode的邮件列表询问是否可以将调号的方向属性修改为U
    • Google Chrome請使用Chrome Canary,但會發生調號原位置出現空白的狀況。

 

Test Case 3: http://binb.tw/bopomofo/case03/

 

  • 文字:橫排
  • 注音:直排
  • 嵌入字型:bpmfgpos.otf by But Ko
  • 效果:透過OpenType GPOS(本案例為'vkrn')調整調號位置
  • 說明:除Webkit Nightly外,不支援ruby-position:inter-character。

 

 

    BOBBY發行與普及

BOBBY做出來再說(;´Д`)。