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

目前常見的字體幾乎都不能同時多文種。例: 國際音標tɕi̯ᴀ˥˥ 維吾爾 (阿拉伯字母被知乎自動過濾?) 藏བོད་སྐད། 緬မြန် 彝ꑳ 滿ᠰᠠ…
关注者
45
被浏览
9,122

6 个回答

没有理想的。让单一字体档支持过多的文种并非理想方案(理由很多)。除了 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 做了一些不错的尝试。