为什么没有一种字体包含所有Unicode字符?

93
基本上就是标题所说的那样。由于复合字符和影响其他字符和连字的字符,正确渲染所有Unicode格式真的很难,我明白这一点。我们有似乎专门设计用于支持最大Unicode符号(Symbola、Code2001等)和某些平面或字符范围的专业字体(BabelStone Han等)。
我不太了解字体的底层技术细节。有最大尺寸吗?这是版权问题吗?重新绘制所有约110,000个现存字形太难吗?我理解风格方面的问题,但为什么不回退到一个具有everything字形的“默认”字体呢?它们在unicode.org上,重新绘制它们都会是相当劳动密集的工作,但你将拥有一个保证覆盖所有内容的回退字体。如果你获得一些现有字体的权利,你可以将它们组合起来,这应该会有很大帮助。这样的字体对人类将是极大的帮助,我看不到任何好的技术原因为什么它不存在或至少没有开放源代码的努力来创建它,所以我推测它不能被完成的原因对我而言是不可见的。
那是什么原因呢?

1
如果你想让你的字体看起来不像业余制作,那么你需要为每个脚本找一个专家。而Unicode有很多脚本。 - Ignacio Vazquez-Abrams
20
风格并不是我所关心的事情。我在想“为什么不使用一个备用字体,它包含所有字符,这样你就永远不会看到'字形不存在',因为那没有帮助”,丑陋的字形总比没有字形好。正如Mike的回答中指出的,有技术上的原因需要使用字体集合,而且有非常出色的开源字体集合工作。 - Jeremy Kemball
除了重量限制之外,样式匹配是为什么字体族被优先选择的原因。大多数CJK字体都有奇怪的拉丁字母,以使后者保持一致。当它们没有被积极地匹配时,你会发现一些奇怪的东西:⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ是我最讨厌的。Adobe Garamond Premier - 昂贵 - 有拉丁文和希腊文,但他们并不打算让化学家同时使用 - "α-ketoglutarate"在许多字体中看起来很奇怪。 - Matteo Ferla
6
我知道这是以前的内容,但我对“重新绘制110,000个字形(包括度量、字距、组合属性和提示)是否太难?”感到惊讶。我曾经从事过排版工作。一个简单而平凡的、由255个基本拉丁字母构成的字体至少需要工作数天,可能需要数周;真正优秀的工作可能需要数月。而110,000相当于400多种具有更加复杂度量等信息的字体。需要15,000小时以上的工作时间,可能需要7年或更长时间。所以,这确实很困难。 - Ashley
1
和我一样:我只想能够看到所有的Unicode字符!如果OpenType规范不够用,就必须扩展它! - cskwg
3个回答

129
除去“为什么你会想要那个?”这样的问题,从编程角度来看,存在一个非常简单的原因:OpenType规范只提供了一个USHORT可寻址的字形索引空间,因此一个字体只能支持16位字形标识符,或最多65536个字形。(请注意术语:“字形” 与“字符”或“字母”不同)。
截至本答案,Unicode的当前版本为v8,包含120,737个已分配的代码点,几乎是现代字体所容纳的两倍(2021版更新:v13将该数字增加到143,859个)。实际上,自2001年发布Unicode 3.1以来,Unicode就无法适应现代OpenType字体,该版本将代码点数量从49,259个增加到94,205个。
"那么字体集合怎么办?"我听到你的问题了。为什么不使用多种字体并支持所有Unicode呢?好吧,现在你刚刚描述了Adobe的Sans Pro和Google的Noto(它们是同一种字体)。
至于“有多难”,要在这个星球上的129种已建立的书写脚本中实现统一风格的所有Unicode字符,每种脚本都有自己的排版规则?非常困难。您可能认为字体只是带有字母图片的文件,某人输入一个字母,该图片就会显示出来:这不是字体的工作方式,也不是自1980年代末以来字体的工作方式。
现代字体就像游戏内存卡一样,是排版的等价物:当然,如果没有运行该内存卡的硬件或软件,它就不太有用,但所有真正重要的事情都在内存卡中。同样,现代字体包含排版的所有信息。它们不仅包含图片,还包括元数据、度量标准、任意序列的位置和替换规则的分离规则集,每个OpenType支持的书写脚本都有单独的规则集,强制性和可选连字,特定语言字符替换用于单词开头/中间/结尾处或孤立处的字母,与任意复杂的其他字符序列的字符重新定位,与其他任意复杂的序列进行任意复杂的序列替换,可能的位图回退用于小点渲染,提示指令用于正确光栅化固有未与任何特定像素网格对齐的矢量图形,以及更多。现代字体是一个非常复杂的应用程序,字体引擎咨询它以了解如何排版代码点序列。
制作一套适用于所有环境的Unicode涵盖字体(集)是一个庞大的团队工作。
因为从2001年开始这在技术上是不可能的,所以“为什么没有一种字体包含所有Unicode字符?” 我们可以制作覆盖所有Unicode字符的字体系列,但是由于129个不同的文字都有自己的排版规则,这是一项非常繁重的工作,并且与仅覆盖所有语言的子集相比,几乎(几乎)不值得努力。

至于这个:

这样的字体将对人类有很大帮助,我看不出为什么它不存在或者至少没有一个开源的努力去创建它,所以我认为它不能被完成的原因是对我来说是看不见的。

仅因为你不知道它们的存在并不意味着它们不存在。数百万人都熟悉他们。 它们确实存在 =)

它们甚至是开源的,走出去感谢制造它们的人!


13
Adobe Blank是一种特殊的极端字体,它与完整的Unicode实现相反:它具有特殊的CMAP,将每个Unicode代码点映射为同一个单独的字形(即“空白”)。 它没有实现任何东西,而是用空白图片表示什么都没有。在字体调试中作为回退使用:如果您看到Adobe Blank的“空白”(它有宽度,因此可以在文本中看到它),则知道您正在调试的字体缺少某些内容。 - Mike 'Pomax' Kamermans
8
我想知道为什么OTF/TTF规范没有更新以支持超过65536个字形。显然我们早已超过了这个限制,下载一个单一字体比尝试浏览字体家族更容易。 - Gili
4
因为它们无法做到。USHORT 只能容纳 65k 个数字。想要更多字符?好消息是:使用字体集合。规范已经更新了字体集合(https://www.microsoft.com/typography/otspec/otff.htm =>“字体集合”)。 - Mike 'Pomax' Kamermans
7
如果你想表达这个观点,可以自由地注册OpenType讨论列表,并发表这个陈述,然后你可能会得到一个相当合理的回答,解释为什么这不会发生(最显著的原因是:它修复了一个不存在的问题,因为字体引擎可以很好地处理字体堆栈,同时会破坏全球每个设备的兼容性。不仅是电脑,还包括当前在世界各地使用的数百万款打印机)。 - Mike 'Pomax' Kamermans
3
"Source Code Pro"并非"Source Pro"系列,它是专为代码编辑器用户而设计的字体子集。请前往https://github.com/adobe-fonts,并查看五个字符集,以包括有衬线(CJK和非CJK)、无衬线(CJK和非CJK)和特殊的等宽编程字体(这就是你下载的"source code pro")。 - Mike 'Pomax' Kamermans
显示剩余6条评论

10

有一个名为GNU Unifont的字体,它旨在包含所有Unicode字符,但不包括苹果Emoji表情符号。


12
除此之外,它仅实现了基本多语言平面,这甚至不到Unicode的一半,并且它实际上并不擅长作为字体:它只是字符映射。如果您需要任何涵盖BMP所包含的相当多的语言所需的复杂文本排版,则GNU Unifont基本上对您没有用处。此外,正如提到的那样,由于编程限制,单个字体无法包含多个USHORT的字形ID,因此您永远无法将所有内容放入单个字体中。这就是为什么存在字体集合的原因。 - Mike 'Pomax' Kamermans
1
@Mike'Pomax'Kamermans 实际上,正如页面本身所指出的那样,GNU Unifont必须作为字体集合(带有Unifonts Upper&CSUR)使用,才能覆盖所有(不需要高分辨率符号的字符)Unicode。即使如此,作者们还指出,“具有字母组合特殊形式的复杂脚本...在Unifont中无法很好地呈现”,并且“Unifont仅适用于最后的字体选择”。请注意,我在浏览网页时专门使用Unifont集合,因为我讨厌自己。 - srborlongan
4
我知道。我查了一下它的作用,这就是为什么我留了个评论。这是一种疯狂的字体,如果你想要本地化的“所有语言”支持,去下载Noto系列或其他类似的字体吧,因为它们确实支持真正的语言而不只是“一些字符”。 - Mike 'Pomax' Kamermans

-1

您可能会在以下链接中找到您要查找的内容。

Unicode字符表

HTML字符实体引用

大量Unicode符号列表

“其他符号”类别的Unicode字符列表

这个链接很有趣,因为您可以绘制您要搜索的特定字符:

Unicode字符识别

即使启用了EnableHexNumpad,也无法使用Alt+输入Unicode字符

基本问题

问:Unicode 中有多少个字符? 答:简短的回答是,截至版本 13.0,Unicode 标准包含 143,859 个字符。长篇回答则更为复杂,因为人们可能对不同类型的字符感兴趣并计算。

Unicode 字体 Unicode 字体是计算机字体,将字形映射到 Unicode 标准中定义的代码点。绝大多数现代计算机字体使用 Unicode 映射,即使那些仅包括单个书写系统字形或仅支持基本拉丁字母的字体也是如此。

支持广泛的Unicode脚本和符号的字体有时被称为“全Unicode字体”,尽管由于TrueType字体中定义的最大字形数限制为65,535,单个字体无法提供所有已定义Unicode字符(143,859个字符,使用Unicode 13.0)的单独字形。

...

没有任何一个“Unicode字体”包含了ISO 10646(Unicode)标准当前修订中定义的所有字符,因为越来越多的语言和字符不断添加到其中,常见的字体格式不能包含超过65,535个字形(大约是Unicode编码的一半字符数)。

因此,字体开发人员和铸造厂在新版本或修订版字体中或专门用于特定语言的单独辅助字体中加入新字符。

享受吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接