是否有“未找到字形”字符?

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.pdf

U+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) 人们很容易对此类问题感到困惑。

以上是关于是否有“未找到字形”字符?的主要内容,如果未能解决你的问题,请参考以下文章

怎么判断一个字符串是不是包含某个字符

jquery 判断字符串是不是有

是否有只包含小写字母数字字符和连字符的字符串的名称?

是否有一些快速算法来检查两个字符串集中的子字符串

C#如何判断字符串中是不是包含某个字符

是否可以有一个(单个)字符的***域名?