如何在電腦或手機的系統/瀏覽器上同時正確顯示 Unicode 的多語種文字?是否有單一字體能夠解決問題?

目前常見的字體幾乎都不能同時多文種。例:

國際音標t?i????

維吾爾 (阿拉伯字母被知乎自動過濾?)

藏????????

緬????

彝?

滿????

泰???

梵???????

希臘?

以上字體恐怕在各位的電腦、瀏覽器、手機等上總會有一些不能正常顯示的,要麼是空白,要麼是方框,要麼能顯示字母但不能正確組合(如阿拉伯、藏、滿蒙之類)。

不知有沒有現成的能同時顯示這些不同文種Unicode的字體?沒有的話,如何能同時在Android手機上正確顯示?也能選擇在不同字符集自動使用不同字體,或需要用已有字體製作一個包含多種語種庫的單一字體?這種字體如何自行製作(本人字體小白,但不麻煩的話願意學習)?

(補充:我目前找到一個google noto fonts系列字體,稱可以把多種文字相對和諧地排在一起,而且是開源的,且有有襯線和無襯線、麤體和斜體的多種選擇,但仍不是一個單一的字體文件,見 https://code.google.com/p/noto/ ,放到Android手機上仍然不能一起全部顯示。)


沒有理想的。讓單一字體檔支持過多的文種並非理想方案(理由很多)。除了 Arial Unicode MS 偶爾能用一用(但也達不到你的需求),其他實在乏善可陳。

像 Windows 自帶的 Nirmala UI(多種印度系文字)和 Gadugi(多種美洲原住民語文字)這樣有明確限定的多文種字體倒還比較有意義。

Code2000(以及 2001 和 2002)這一系字體的確覆蓋面廣,但字體設計質量完全是慘不忍睹,連基本西文設計都無法直視,根本沒法用;Bitstream Cyberbit 和 TITUS Cyberbit 的覆蓋面實在太小了,而且 TITUS 項目給 Cyberbit 新增的那些一樣是慘不忍睹;還有 GNU Unifont 這樣的神奇項目,點陣字體,與 Unicode 標準同步,但只管碼點顯示,不管任何 OpenType layout。維基百科上對這些 pan-Unicode 項目有一些簡單的對比,可參考:Unicode font

每個字體檔各司其職,配置細緻的字體回退(fallback),這才是合理的手段。

題主說的「選擇在不同字符集自動使用不同字體」實際上就是目前已經在各排版環境中廣泛應用的字體回退機制啊,要不然你以為 Android 是怎麼讓西文用 Roboto 顯示然後中文用 Droid Sans Fallback 的?

而複雜文種(比如阿拉伯字母、蒙文、天城字母、各種偏門印度系文字)無法顯示的事情,又往往不單是字體支持與否的問題。

因為 OpenType 對複雜文種的策略是,字體要在排版環境對該文種的支持基礎上來做 OpenType layout,那麼如果操作系統或瀏覽器不支持一個文種,就沒有正當途徑單單利用 OTL 字體來顯示。像 InDesign 現在不支持藏文以及 OS X 不支持蒙文就都是這種問題。

另:知乎頁面現在過濾阿拉伯字母,不知到底依舊是因為原來那個 Core Text 的 bug 還是因為政治問題。

因此你應當做的是:確認你的排版環境支持特定文種的 OTL,找到支持該文種的 OTL 字體(比如通過操作系統自帶字體或 Noto 這樣的項目),然後在你的排版環境中搞定字體回退配置。

至於字體回退,在 Android 或 OS X 中,修改字體配置文件;在 InDesign 或 TeX 的專業出版流程中,為不同文字指定字體也沒什麼問題。

在多字體檔加回退的路線上,目前做得最好的,就是 Google 這個錢多人善巨頭做的 Noto 項目:Google Noto Fonts ——自己去這官網看看目前已支持的文種列表就知道是個什麼情況了(題主估計沒什麼問題,但普通人估計這列表中一大半文種都沒聽說過吧)。

Noto 這個項目的目標是覆蓋整個 Unicode 字符集並為主要文種提供無襯線與襯線雙風格字體。如果看到一些文種還未支持(比如藏文),請耐心等待,因為這個項目還在瘋長中。

前些日子出名的 Source Han Sans (思源黑體) / Noto Sans CJK 就是 Noto 計劃的一部分。

我本來還寫了一些字體技術上的限制問題。但後來感覺,呃,題主還是不要蹚大一統單一字體檔的混水了。要理解並利用回退機制。


單一的多語種 unicode 字體是存在的,比如 Bitstream Cyberbit,效果大致是:

還有 Code2000,它比 Bitstream Cyberbit 更大,有超過 58000 個圖元,可以覆蓋幾乎所有的文種。至於 Layout 的問題,目前 Opentype 規範里沒有包含一些複雜文種的排版規則(比如南亞文字中出現的圖元重排),這方面 Graphite 做了一些不錯的嘗試。


關於一個字體按照語言顯示 Unicode 所有字元。。。顯然這裡有一個問題,一般電腦可以安裝的 OpenType 或者 TrueType 字體文件 (可由多個字型組成,如 Microsoft YaHei Microsoft YaHei UI 來自同一個字體文件) 限制每文件 glyph 數為 65535 (還是 65536? 忘記了),這麼多 glyphs 做一個能夠顯示規範的簡體中文,繁體中文,日文和韓文的字體文件都才剛剛好夠(ref Source Han Sans),況且這只是 4 種語言。如果再加上一些其它語言的文字顯然。。。即使有這種字型,由於格式不兼容,也幾乎沒有電腦可以正常使用。當然一些專業應用支持特殊字體格式另說。

回到正題。我是用 Windows Phone 回的這題,維吾爾好像木有文字,緬甸語只有方格,其它正常。

個人觀點,如果字體夠多, fallbacks 正確,是足以 cover Unicode 的。當然,簡體中文顯示成日語 — 或者反過來 — 神馬的,是沒辦法的事情,只能由開發者指定Lang 來避免。而 fallback 是由瀏覽器自動決定的,有時會不滿意甚至出錯,所以對於開發者來說,應該使用正確的 lang 屬性和兼容性好的 fallback fonts. 當然安卓的系統總共那麼小,沒有為某些沒多少人使用的語言準備字體 (甚至連繁體中文都只有簡體字型, say) 或者 fallback 不恰當,一些文字有字型卻看不到,也是有可能的。

以上。


1. 設計一種字體,以涵蓋全部Unicode字元,這種想法無法實現。因爲字體文件負責的不只是顯示出字元。在Unicode環境下,字體文件必須考慮不同字體方向、高、寬、垂直對齊方式、與變音修飾符組合等多方面問題。鑒於全球目前那麽多語種那麽多不同的書寫系統,要實現字體大一統,不現實。就算設計出來了,文件體積也很大,而且絕大多數用戶絕大部分時間根本不會用到多語種字元。

2. 在操作系統支持的前提下,部分字處理工具和瀏覽器對多語種字元顯示有較好的支持。桌面環境下,Windows 7 8 10對Unicode的支持都還算行,Microsoft Word 2007及以上版本能夠處理複雜的多語種文本,Firefox目前主流版本默認開啓Graphite,在多語種支持上做得比較優秀,IE 9+也不錯。移動平臺的情況,因爲用得少,所以無法作答。

3. 推薦多語種顯示檢測頁面 http://www.columbia.edu/~kermit/utf8.html。在我的系統中,IE 11, Chrome 35, Firefox 28 (我沒有及時更新)都能正常渲染。其中,IE效果最好。

4. 推薦Unicode字體Charis SIL, Cardo和Gentium,這幾款字體的覆蓋面較廣,字型比較美觀。如果不計較字型,還可以用FreeSerif。可惜,這些字體都不支持中文。Windows系統自帶Segoe UI,能支持所有正式發行了當地語言版本的書寫系統。


沒有,首先要明確手機,iPhone iOS 系統, iSO 各種瀏覽器,Android 系統,Android 各種瀏覽器,電腦,Windows, Mac OS, 各種 PC 端瀏覽器,字體調用機制都是不一樣的。

即使只針對其中任意一種都不存在一個通用字體,許多特殊文字需要特殊的 layout,比如有的文字是幾個字元上下或斜上斜下排的,有的像 emoji 或藏文,存在兩個 unicode 才能拼成一個文字的狀況,這些布局和細則通常並不和我們常見的文字相同,並且有不兼容的。

假如把不同布局規則的字體都包含在一個字體文件的話,通常會在某些情況出現布局衝突和錯亂情況。

靠譜的方法是有一組經過嚴格測試過的字體,一個配套的 fallbacklist。基本上可以應對大部分走 fallback 原理的字體機制。

另外從開發者的角度出發,把字體分開的維護成本會遠小於都包在同一個字體裡面的,因為如果都在一個字體包里的話,只要一個字元有問題,就會牽連所有的字元,每做一次調整所有的字元都被暴露在出現 bug 的風險下,所以是極不合理。


unifont不謝,覺得丑是不習慣,要麼醜死要麼缺,求處女座摺疊。


推薦閱讀:

普通屏幕筆記本安裝黑蘋果如何選擇字體才能有完美的顯示效果?
哪種宋體在電腦上寫文章最好看?疏密合適,看著很舒服
為什麼 Windows 下 cmd 和 PowerShell 不能方便地自定義字體?
word中正文每頁首行設置一個段前距離,怎麼設置?
醫生寫的字可以有多美?

TAG:字體 | Unicode統一碼 |