是否存在任何Unicode字符,其字形在所有字体中都不存在?

7
在安卓系统上,我希望能够检测所使用的字体是否能够显示特定字符。但据我所知,传统方法并不能实现此功能,正如Check if custom font can display character中所指出的那样。
为了检测这一点,我会先将想要检查的字符写入一个位图中,然后再将我已知缺失的另一个字符写入另一个位图,并对比这两个位图的内容。如果它们相等,则说明该字符缺失。
问题是:在安卓手机上通常使用的字体中,是否有任何一个Unicode字符的字形通常会缺失? 当我们在维基百科上阅读有关Unicode替换字符时,它似乎很有前途:

它用于表示系统无法将数据流呈现为正确符号时的问题。当字体不包含字符时,它最常见。但也会在数据无效且不匹配任何字符时出现

然而,在做了一些测试之后,我发现该字符既不用于代表Windows 7计算机上找不到的字形,也不用于代表我所测试的安卓手机(摩托罗拉Atrix)上找不到的字形。

Unicode 包含超过 110,000 个字符,并且有 1,114,112 个代码点的限制。因此,在不太可能的情况下,如果字体具有所有字形(支持所有书写系统、所有语言),则仅使用可用代码点的 10%。其余为空。如果您呈现空格字形,会怎样?您是否了解“缺失字符字形”? - allcaps
我之前不知道“缺失字符字形”,通过一些搜索,发现在字体中可以/应该使用U+0000来表示缺失的字符。然而,在我测试的至少一个字体中,U+0000被渲染为空格,而缺失的字符则被渲染为正方形(类似于U+25A1)。我想最好的选择是使用一些保留/未分配的Unicode字符来代替。 - nibarius
U+0000通常用于标记字符串的结束。您需要.notdef,表示未定义的Unicode值:http://www.microsoft.com/typography/otspec/recom.htm字符被分配到相同类型的块中。大多数块在末尾有一些未分配的点,以便在一个整数开始下一个块。这些点允许Unicode联盟向块中添加新的字形。新的字形并不经常出现。请参阅http://typophile.com/node/102205。也许您可以在Typophile论坛上提问。他们可以告诉您更多关于这个过程的详细信息以及如何渲染.notdef。 - allcaps
感谢提供“OpenType字体推荐”链接,对我很有用。看起来我把字形ID 0和Unicode代码点U+0000混淆了。根据我的需求,使用其中一个保留的代码点就足够了(请参见我的回答)。 - nibarius
是的,这是一个重复的问题。想要检测缺失字形的原因略有不同(自动检测与用户手动检测),但实际问题是相同的。 - nibarius
1个回答

4

在用于呈现缺失字形的字体中,没有指定Unicode值。在实际字体中,字形ID 0应始终是.notdef字形,用于所有缺少字形的字符。但是在Android上无法从字体中获取此信息,因此无法直接使用.notdef字形。

在Unicode中,有许多保留/未分配的代码点,我的有限测试表明这些代码点使用.notdef字形进行呈现。因此,通过使用U+0978(位于天城体块中间的保留代码点),我可以检测所需测试字体中是否存在其他有效的已知字符。

这不是一种未来的解决方案,因为Unicode联盟将来可能会向保留的代码点添加新的字形。但对于我的需求来说,它已经足够好了,因为我想要做的只是一个临时的事情,在不久的将来不再相关。

更新:

查看 U+0978 的解决方案不再可行。该字符是在 Unicode 7.0 版本中于 2014年6月 添加的。另一个选项是使用存在于unicode中但很少在普通字体中使用的字形。

U+124AB早期楔形文字块中可能根本不存在于许多字体中。


7
技术上讲,U+25A1是一个流行的选择,因为它有注释“可用于表示缺失的表意文字”--或者U+20DE也可以使用。这直接来自当前的Unicode规范:http://www.unicode.org/charts/PDF/U25A0.pdf - Michaelangel007
那是很有用的信息。然而,在我的特定情况下,它不能被使用,因为它们只能“可能”用于那个目的。例如,在Roboto字体中,U+25A1和U+20DE都缺少一个字形。 - nibarius
另一个选择是使用Unicode中存在但在普通字体中很不可能使用的字形。这种方法可能无法与Noto一起使用(因为Noto试图为Unicode中的每个字符提供字形)。但是,您可以使用专用区代码点。有很多这样的代码点,Unicode永远不会在那里编码“真正”的字符。 - Kevin

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