当前位置: 首页 > 知识库问答 >
问题:

为什么没有包含所有 Unicode 字形的字体?

米树
2023-03-14

正如标题所说。正确呈现所有的unicode格式,包括复合字符和影响其他字符和连字的字符,这真的很难,我理解这一点。我们的字体似乎是为最大限度地支持Unicode符号而设计的(Symbola、Code2001等),以及特定平面或字符范围的专用字体(BabelStone Han等)。

我不太了解字体的底层技术细节。有最大尺寸吗?是版权问题吗?重画所有现存的大约110,000个符号是不是太难了?我理解对样式的担忧,但是为什么不回退到一个“默认”的字体呢?他们在unicode.org,重新绘制他们都将是相当困难的工作,但你会有一个保证一切的后备字体。如果你有权利使用一些已经存在的字体,你可以把它们合成在一起,这样会有很大帮助。这样的字体将会对人类有很大的帮助,我看不到一个很好的技术原因来解释它为什么不存在,或者至少是一个开源的努力来创造它,所以我假设一个对我来说看不见的原因来解释它为什么不能被实现。

那是什么原因?

共有3个答案

杨学真
2023-03-14

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

Unicode字符表

HTML字符实体引用

庞大的统一码符号列表

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

这另一个是有趣的特定字符,因为你可以画你搜索:

Unicode字符识别

即使使用EnableHexNumpad,也不能使用Alt键输入unicode字符

基本问题

问:统一码中有多少个字符?答:简短的回答是,从版本 13.0 开始,Unicode 标准包含 143,859 个字符。长答案相当复杂,因为人们可能有兴趣计算所有不同类型的字符。

统一码字体 Unicode 字体是一种计算机字体,它将字形映射到 Unicode 标准中定义的代码点。绝大多数现代计算机字体都使用Unicode映射,即使是那些只包含单个书写系统的字形的字体,甚至只支持基本的拉丁字母。

支持多种Unicode脚本和Unicode符号的字体有时被称为“泛Unicode字体”,尽管TrueType字体中可定义的最大字形数限制为65535,但单个字体不可能为所有已定义的Unicode字符(143859个字符,Unicode为13.0)提供单个字形。

...

随着越来越多的语言和字符被不断地添加到单个“统一码字体”中,没有一个“统一码字体”包括ISO 10646(统一码)标准的当前修订版中定义的所有字符,并且普通字体格式不能包含超过65,535个字形(大约是统一码中编码的字符数量的一半)。

因此,字体开发人员和代工厂将新字符合并到字体的较新版本或修订版中,或者用于特定语言的单独辅助字体中。

享受!

叶智
2023-03-14

有GNU统一字体。它旨在包含所有Unicode,除了Apple Emoji。

郝君博
2023-03-14

“你为什么还要这样?”问题撇开不谈,从编程的角度来看,有一个非常简单的原因:OpenType 规范只提供一个USHORT的可寻址字形索引空间,所以一种字体只能支持16位字形标识符,或者最多65,536个字形(请注意术语:“字形”与“字符”或“字母”不同)

Unicode的当前版本v8包含120,737个分配的代码点,几乎是现代字体的两倍(2021年编辑:v13将这个数字增加到143,859)。事实上,自2001年发布Unicode 3.1以来,Unicode就无法适应现代OpenType字体,Unicode 3.1将代码点的数量从49,259增加到94,205。

“那么字体集合呢?”我听到你问。为什么不使用多种字体并以这种方式支持所有unicode?好吧,现在,您刚刚描述了Adobe的无忧无虑专业版和谷歌的Noto(它们是相同的字体)。

至于“它有多难”:Unicode中所有字形的统一风格,跨越这个星球上129个已建立的书面脚本,每个脚本都有自己的排版规则?难以置信的困难。你可能认为字体只是带有字母图片的文件,有人键入一个字母,那张图片就会显示出来:这不是字体的工作方式,也不是自1980年代后期以来字体的工作方式。

现代字体相当于游戏ROM的排版:当然,如果没有运行ROM的硬件或软件,就没有多大用处,但所有真正重要的东西都在ROM中。同样,现代字体包含了排版的所有信息。不仅仅是图片,它们还包含元数据、度量、任意序列的定位和替换规则、OpenType支持的每个书写脚本的单独规则集、强制和可选连字、单词中开始/中间/最后位置的字母的特定语言字符替换,或者单独包含,相对于之前或之后任意复杂的其他字符序列的字符重新定位,用其他任意复杂的序列替换任意复杂的字符序列,小点渲染的可能位图回退,关于如何正确光栅化与任何特定像素网格固有不对齐的矢量图形的提示说明,等等。现代字体是一个极其复杂的应用程序,字体引擎会参考它来确定如何排版代码点序列。

制作一个(一组)包含 Unicode 的字体,使其在所有上下文中看起来都不错,这是一项巨大的团队工作。

所以:“为什么没有包含所有Unicode字形的字体?”,因为自2001年以来,这在技术上是不可能的。我们可以,而且确实可以,制造出涵盖所有Unicode的字体系列,但129种不同的脚本都有自己的排版规则,这是一项艰巨的工作,与只涵盖所有语言的一个子集相比,几乎(几乎)不值得付出努力。

至于这个:

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

仅仅因为你不知道他们,并不意味着他们不存在,有数百万人熟悉他们。他们存在=)

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

 类似资料:
  • 问题内容: 如何在mysql中选择仅包含大写字符的字段或不包含任何小写字符的字段? 问题答案: 您可能需要使用区分大小写的排序规则。我相信默认值不区分大小写。例: 然后: 如果您不想在整个表中使用区分大小写的排序规则,则也可以使用其他答案中建议的@kchau子句。 让我们尝试使用不区分大小写的排序规则的表: 这不能很好地工作: 但是我们可以使用子句将名称字段整理为区分大小写的整理:

  • 问题内容: 从golang规范 是否有使用内的 空白 字段的实际方案?(一些代码片段将不胜感激) 问题答案: 填充正是所谓的:一些填充,用于将以下字段与您的需求对齐,例如,匹配C结构的布局。无法访问它(至少在没有软件包不安全的情况下)。

  • 我启动了一个国际象棋项目,使用一些旧代码绘制地图,基本上所有内容都是复制粘贴的。问题是方块没有出现?我试着修了一会儿,但没有找到解决办法。下面可能是三种最重要的方法,并简要介绍了整个项目。有些是德语的。 https://drive.google.com/file/d/1nnZHLB0Ycy04eMyYbEmduMwbGhVLZ2VB/view?usp=sharing

  • 问题内容: 我可以通过将L附加到值来创建文字。为什么我不能以类似的方式创建字面量的short或byte?为什么我需要在转换时使用int文字? 如果答案是“因为C中没有短文字”,那么为什么C中没有短文字? 这实际上并没有以任何有意义的方式影响我的生活;写(短)0而不是0S很简单。但是这种矛盾使我感到好奇。这是当您深夜起床时困扰您的事情之一。有人在某个时候做出了设计决定,使得可以为某些原始类型输入文字

  • 我在Mako模板中有以下代码: 这将url转义应用于表示公司的对象的名称字符串。然后在URL中使用得到的转义字符串。Mako文档说明使用提供url编码。 在服务器上,我将公司名称部分接收到参数中: 然后使用investment_name作为键返回到模板中提取它的字典中。 这对于公司名称中的所有标准大小写(如空格、斜杠和单引号)都很适用。但是,如果公司名称包含ascii字符集之外的unicode字符

  • 我的webpack加载器如下所示: 但尝试包含文件时出错 ./node_modules/css-loader中出错?{“sourceMap”:true,“modules”:true,“importloaders”:1,“localidentname”:“[local]_[hash:base64:3]”}!./node_modules/postcss-loader/lib?{“plugins”:[n