为啥没有包含所有 Unicode 字形的字体? [关闭]
Posted
技术标签:
【中文标题】为啥没有包含所有 Unicode 字形的字体? [关闭]【英文标题】:Why isn't there a font that contains all Unicode glyphs?为什么没有包含所有 Unicode 字形的字体? [关闭] 【发布时间】:2016-04-16 10:07:50 【问题描述】:正如标题所说。正确渲染所有 unicode 格式,以及影响其他字符和连字的复合字符和字符真的很难,我理解这一点。我们的字体似乎是为最大程度地支持 Unicode 符号而设计的(Symbola、Code2001 等)和特定平面或字符范围的专用字体(BabelStone Han 等)。
我对字体的底层技术细节了解不多。有最大尺寸吗?是版权问题吗?基本上重绘所有约 110,000 个现存字形是否太难了?我了解样式问题,但为什么不回退到具有 everything 字形的“默认”字体?它们在 unicode.org 上,重新绘制它们将是一项非常艰巨的工作,但是您将有一个保证所有内容的备用字体。如果您拥有某些预先存在的字体的权利,您可以合成它们,这应该会有很大帮助。这样的字体将对人类有很大的帮助,我看不出它不存在的良好技术原因,或者至少是创建它的开源努力,所以我认为这是一个对我来说不可见的原因做不到。
那是什么原因?
【问题讨论】:
如果你想让你的字体看起来不像是业余的努力,那么你需要一个专家来处理每个脚本。 Unicode 有很多 种脚本。 风格不是我关心的问题。我在想“为什么不拥有一个包含所有内容的后备字体,这样你就永远不会看到'字形不存在',因为这没有帮助”,一个丑陋的字形胜过没有字形。正如 Mike 的回答中所指出的,需要字体集合的技术原因,以及非常好的开源字体集合工作。 除了重量限制外,样式匹配是首选字体系列的原因。大多数 CJK 字体都有看起来很奇怪的拉丁字母,以积极地使后者保持一致。当它们没有主动匹配时,您就会感到奇怪:⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ是我的宠儿。 Adobe Garamond Premier —Pricey — 有拉丁语和希腊语,但他们并不打算让化学家同时使用这两种语言——“α-酮戊二酸”在许多字体中看起来很奇怪。 我知道这是旧的,但我对“重绘 110K 字形(使用度量和字距调整以及组合属性和提示)太难了吗?”感到惊讶?我以前做排版。一个简单的、非原创的字体,包含 255 个直截了当的 latin-# 字母,至少需要几天的工作时间;大概几周;几个月的真正好工作。 110K 相当于 400 多张面孔,具有 更多 更难的指标等。 15,000 小时或更多的工作时间;所以至少7年左右。所以,有点难。 和我一样:我只想能够看到所有的 Unicode 字符!如果 OpenType 规范没有削减它,它必须被扩展! 【参考方案1】:“你为什么想要那个?”抛开问题不谈,从编程的角度来看,有一个非常简单的原因:OpenType spec 仅提供一个 USHORT 的可寻址字形索引空间,因此一种字体只能支持 16 位的字形标识符,或最多 65,536 个字形。 (并注意术语:“字形”is not the same 作为“字符”或“字母”)
Unicode 的当前版本(截至本答案的 v8)包含 120,737 assigned code points,或几乎是现代字体的两倍(2021 年编辑:v13 将此数字提高到 143,859)。事实上,自 2001 年以来,Unicode 一直无法适应现代 OpenType 字体,随着 Unicode 3.1 的发布,代码点的数量从 49,259 增加到 94,205。
“那么字体集合呢?”我听到你问。为什么不使用多种字体并以这种方式支持所有 unicode?现在,您刚刚描述了 Adobe 的 Sans Pro 和 Google 的 Noto(它们是相同的字体)。
至于“有多难”:Unicode 中所有字形的统一风格,跨越这个星球上 129 种已建立的书面文字,每个文字都有自己的排版规则?难以置信的艰难。您可能会认为字体只是带有字母图片的文件,并且有人键入一个字母,该图片就会显示出来:这不是字体的工作方式,也不是自 1980 年代后期以来字体的工作方式。
现代字体相当于游戏 ROM 的排版:当然,如果没有运行该 ROM 的硬件或软件,它并没有多大用处,但所有真正重要的东西都在 ROM 中。同样,现代字体包含所有用于排版的信息。不仅仅是图片,它们包含元数据、度量、任意序列的定位和替换规则,OpenType 支持的每个书面脚本都有单独的规则集、强制和可选的连字、开始/中间字母的特定语言字符替换/final 在一个单词中的位置,或单独的,相对于它之前或之后的其他字符的任意复杂序列的字符重新定位,用其他任意复杂的序列替换任意复杂的序列,可能的位图后备小点渲染,提示说明如何正确光栅化本质上不与任何特定像素网格对齐的矢量图形,等等。现代字体是一个非常复杂的应用程序,字体引擎咨询以找出如何排版代码点序列。
制作一个(一组)包含 Unicode 且适用于所有上下文的字体是一项巨大的团队努力。
所以:“为什么没有包含所有 Unicode 字形的字体?”,因为自 2001 年以来,这在技术上是不可能的。我们可以而且确实可以制作涵盖所有 Unicode 的字体系列 ,但是有 129 种不同的脚本都有自己的排版规则,这是一项大量的工作,与只涵盖所有语言的一个子集相比,几乎(几乎)不值得付出努力。
至于这个:
这样的字体将对人类有很大的帮助,我看不出它不存在的充分技术原因,或者至少是开源的努力来创建它,所以我假设对我来说是不可见的无法完成的原因。
仅仅因为您不了解它们,并不意味着它们不存在,数以百万计的人熟悉它们。它们存在 =)
They're even open source,出去感谢制作它们的人!
【讨论】:
Adobe Blank 是一种非常特殊的字体,它与完整的 Unicode 实现相反:它有一个特殊的 CMAP,将每个 Unicode 代码点映射到相同的单个字形(“空白” )。它没有实现一切,而是什么都不实现,并用一张空白的图片表示什么都没有。它在字体调试中用作测试期间的后备:如果您看到 Adobe Blank 的“空白”(它有一个宽度,因此您可以在文本中看到它),您就知道您正在调试的字体缺少一些东西。 它的特殊用途是在您进行字体设计实现时,以及在将某些东西发送到生产之前进行校对(无论是文本、网页等)。特别是对于后者,看到“什么都没有”而不是使用不同字体样式的文本(可能足够相似以至于您在第一次校对时没有发现它)是非常有价值的。 我想知道为什么不更新 OTF/TTF 规范以支持超过 65536 个最大字形。很明显,我们不久前已经超过了这个限制,下载单一字体比尝试浏览字体系列更容易。 因为他们不能。一个 USHORT 只能容纳 65k 个数字。想要更多角色?好消息:使用字体集合。规范已更新为 (microsoft.com/typography/otspec/otff.htm => "font collections") 然后随意注册 OpenType 讨论列表并发表该声明,然后您可能会得到一个非常合理的回应,说明为什么没有发生这种情况(最值得注意的是:它修复了一些问题这不是问题,因为字体引擎可以很好地处理字体堆栈,但同时破坏了地球上所有设备的兼容性。不仅是计算机,还有全球目前使用的数百万种打印机)【参考方案2】:有GNU Unifont。它旨在包含除 Apple Emoji 之外的所有 Unicode。
【讨论】:
除了它没有 - 它只实现了基本多语言平面,它甚至不是 Unicode 的一半,而且它实际上并不擅长作为一种字体:它只是一个字符映射。如果您需要 BMP 涵盖的许多语言所需的任何类型的复杂文本整形,那么 GNU Unifont 对您来说基本上是无用的。此外,如前所述,单一字体由于编程限制不能包含多个 USHORT 字形 ID,因此您永远无法将所有内容放在单一字体中。这就是集合存在的原因。 @Mike'Pomax'Kamermans 事实上,正如in the page itself 所述,GNU Unifont 必须用作字体集合(使用 Unifonts Upper 和 CSUR)才能覆盖所有(不需要高分辨率符号)Unicode。即便如此,作者也注意到complex scripts with special forms for letter combinations...will not render well in Unifont
和Unifont is only suitable as a font of last resort
。请注意,我在浏览网页时专门使用 Unifont 集合,因为我讨厌自己。
我知道吗?我查了一下它做了什么,这就是我留下评论的原因。这是一种疯狂的字体,如果你想要本地“所有语言”的支持,去拿 Noto 家族什么的,因为那些确实支持真正的语言,而不仅仅是“一些字形”。跨度>
【参考方案3】:
您可能会在以下链接中找到您要查找的内容。
Unicode Character Table
html Character Entity References
Huge List of Unicode Symbols
List of Unicode Characters of Category “Other Symbol
这个对特定角色来说很有趣,因为你可以画出你搜索的东西:
Unicode Character Recognition
Can't enter unicode character with Alt+ even with EnableHexNumpad
Basic Questions
问:Unicode 中有多少个字符? 答:简短的回答是,从 13.0 版开始,Unicode 标准包含 143,859 个字符。长答案相当复杂,因为人们可能有兴趣数数不同种类的字符。
Unicode font Unicode 字体是一种将字形映射到 Unicode 标准中定义的代码点的计算机字体。绝大多数现代计算机字体都使用 Unicode 映射,即使是那些仅包含单一书写系统的字形,甚至仅支持基本拉丁字母的字体。
支持各种 Unicode 脚本和 Unicode 符号的字体有时被称为“泛 Unicode 字体”,尽管 TrueType 字体中可以定义的最大字形数量限制为 65,535单个字体可以为所有已定义的 Unicode 字符(143,859 个字符,Unicode 13.0)提供单独的字形。
...
没有单一的“Unicode 字体”包含 ISO 10646 (Unicode) 标准的当前修订版中定义的所有字符,因为越来越多的语言和字符不断添加到其中,并且常见的字体格式不能包含超过 65,535 个字形(大约是 Unicode 编码字符数的一半)。
因此,字体开发商和铸造厂将新字符合并到字体的较新版本或修订版中,或者专门用于特定语言的单独辅助字体中。
享受吧!
【讨论】:
以上是关于为啥没有包含所有 Unicode 字形的字体? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在基于 Debian 的系统上,如何找到字体具有字形的 Unicode 代码点?
当我们使用 text-transform: 大写时,为啥 IE7 要求 EOT 字体包含小写字形?
PHP:直接利用 Unicode 字形和 Open Type 字体 (otf) 的字距调整表的优势来创建 PDF 作为服务器响应