是否有“未找到字形”字符?
Posted
技术标签:
【中文标题】是否有“未找到字形”字符?【英文标题】:Is there a "glyph not found" character? 【发布时间】:2012-11-23 17:03:02 【问题描述】:假设我们有一个文本,其中包含一个无法显示的 Unicode 字符,因为我们的字体没有对应的字形。通常,会显示一个占位符,例如一个矩形块的东西(见截图)。
是否存在可靠地生成此字形的“未找到字形”字符?我想在 UI 中写类似 "If the following text contains <insert character here> then you need another font..."
的东西。
顺便说一句,我不是在谈论 � (replacement character)。当无法从数据流中正确解码 Unicode 字符时,会显示该字符。它不一定会产生相同的字形:
【问题讨论】:
矩形是“未找到字形”字形。不要帮忙。 虽然关于“未找到字形”字形有很多很好的答案,但这并不能帮助您实际检测到它,因为代码中的文本字符串仍然会包含字符,而不管使用的字体如何渲染它。我认为一些渲染库可以选择查询字体,但我不知道这是多么标准。 虽然我认为“缺少的字形”没有 Unicode 代码点,但在 TrueType 和 OpenType 字体中,这保证在字形 ID 0。如果您控制 unicode 字符的转换要字体中的字形,例如,您可以将私人使用区域中的代码点映射到字形 ID 0,然后使用它。 【参考方案1】:没有找到 3 个可能的字形字符。
查看 Microsoft 规范,主题 .notdef glyph 的形状, https://docs.microsoft.com/en-us/typography/opentype/otspec170/recom#shape-of-notdef-glyph
【讨论】:
【参考方案2】:有一个 notdef 字符表示未找到该字形。但它没有字符码。您可以使用控制字符的charcodes插入一个notdef字符(如“”,U+0002)
【讨论】:
这个角色好像不能在***中发布【参考方案3】:Unicode 使用这些术语:
替换字形 缺少字形 可解释但不可渲染的字符Unicode 标准 (10.0) 没有定义它们的外观,但它在第 5.3 章 [PDF] 中建议实现显示
[...] 独特的字形,给出了其类型的一些一般指示 [...]
将它们与“未分配的代码点”区分开来。他们举了一些例子:
Unicode glossary entry says:
它通常显示为一个开放的或黑色的矩形。
tl;dr:没有标准化的外观/字形,这取决于实施。为了帮助用户,实现可以显示字形来指示无法显示的字符类型。
【讨论】:
【参考方案4】:另外,(据我所知)日语使用 GETA MARK 〓 U+3013
CJK Symbols and Punctuation
【讨论】:
【参考方案5】:不,没有“找不到字形”字符。不同的程序使用不同的图形表示。一个空的窄矩形是一种常见的渲染,但不是唯一的。它也可以是一个带有问号的矩形,也可以是一个带有十六进制字符代码的矩形。
所以最好是例如将角色的小图像与角色本身一起显示,以便读者进行比较。
【讨论】:
在几款 android 手机上,缺少的字形仅用几个像素的空白空间绘制。所以它甚至不必是可见的。【参考方案6】:来自 Unicode 规范:
http://unicode.org/charts/PDF/U25A0.pdfU+25A1
□白色方块
可用于表示缺失的表意文字
→U+20DE
$⃞组合封闭方块
【讨论】:
我已将您的编辑回滚到 Jukka K. Korpela 的回答。请在此答案中包含该信息和/或在其他答案中添加评论。 为什么不直接在其中包含信息并删除这个答案?【参考方案7】:使用像 U+10FFFF(在 Unicode 空间的最末端)这样的非字符,它 99.99% 肯定不会在任何正常字体的 cmap 表中找到。至少没有已知的 Windows 系统字体将该非字符映射到字形,也极不可能有任何 Linux/Mac 系统字体。即使是包罗万象的 Last Resort 字体 (http://www.unicode.org/policies/lastresortfont_eula.html) 似乎也没有映射它。因此,虽然在 Unicode 中没有定义将映射到 .notdef 字形的官方“未找到字形”字符,但实际上上述非字符保证显示该字形,无论该特定字体中的字形设计是什么。 .notdef 字形(OpenType 中的字形 id 0)可能是一个简单的空心矩形(标准)、带有 x 的框、带有问号的框、偶尔空白(这是不好的做法),有时还有一些奇怪的东西,例如螺旋(在 Palatino Linotype 中) .
【讨论】:
【参考方案8】:字形未找到字符由字体引擎和字体指定;它没有固定的字符。
【讨论】:
问题清楚地表明它与替换字符无关,并且 REPLACEMENT CHARACTER U+FFFD 是 一个固定字符(它没有固定字形,尽管字体包含它倾向于使用非常相似的字形)。 @Jukka:除了我也不是在谈论 U+FFFD。 那么不要使用“替换字符”这个短语,因为 a) 它根本不是一个字符,b) 它不是 Unicode 名称 REPLACEMENT CHARACTER 的字符,c) 人们很容易对此类问题感到困惑。以上是关于是否有“未找到字形”字符?的主要内容,如果未能解决你的问题,请参考以下文章