我可以在我的代码中硬编码字形索引吗?

Posted

技术标签:

【中文标题】我可以在我的代码中硬编码字形索引吗?【英文标题】:Can I hardcode glyph indices in my code? 【发布时间】:2012-04-14 21:59:38 【问题描述】:

鉴于 Windows API 函数 GetGlyphIndices() 可以将 2 字节的 UNICODE 字符代码转换为字形索引,我打算硬编码这些字形索引,而不是 UNICODE 点。这可能吗?

我知道 MS 稍后可能会更改此函数为一个特定 UNICODE 点返回的值,但我希望在这种情况下,当前字形索引将保留在字形集中。

换句话说,我的理解是,如果 MS 决定将新的字形索引与 UNICODE 点相关联,它将扩大字形集以保留旧字形。

有人可以确认吗?

【问题讨论】:

这种期望让程序员忙于维护他们的代码。像 Raymond 这样的人正忙于与 appcompat 作战。一种明显的故障模式是字体映射器生成替代字体,因为您希望使用的字体在机器上不可用。 @HansPassant 任何使用 OpenType 字体的程序都必须访问 OpenType 字体文件中的一些表,例如 GSUB、GPOS、cmap 等……这不仅仅是调用 @987654322 的问题@ 或 CreateFontIndirect()。因此,像这样的代码无法捕获源自替代字体的错误的可能性几乎为零。 您可能希望在您的问题中更明显地表明您正在谈论 OpenType。虽然 Microsoft 对 appcompat 做出了相当坚定的承诺,但其他 OpenType 供应商不一定如此。 打电话给GetGlyphIndices有问题吗? @DavidHeffernan 一点也不。我的问题与 OpenType 字体的字形集中字形的持久性有关。我的信念是它是持久的,尽管在 MSDN 中显然没有说支持或反对这个假设。 【参考方案1】:

不能保证总是附加新的字形。 (如果字形被删除怎么办?)

【讨论】:

感谢您的回复。我有理由假设字形不会从字形集中删除。例如,字形 0x01B9、0x01BD、0x01C2 和 0x01CE,它们是圆符、卡隆、短音符和波浪号的字形变体,已被 Cambria Math 字体中的字形 0x1218、0x1219、0x121D 和 0x121A 所取代,但字形集中仍然存在旧字形。 无法保证您所做的假设在未来仍然有效。风险自负,并确保您的客户了解风险。 我理解你的担心,这也是我的。这就是我发布问题的原因。但我想在 MSDN 文档中查看您刚才所说的内容。你知道任何支持这一点的参考资料吗? 你如何证明是否定的?如果找不到保证,则没有保证。 @user1042389:你指的是 Unicode 稳定性策略。 Unicode 是一种编码标准。它不保证字体文件内容的稳定性。正如 Raymond 所指出的,不能保证您今天使用的字体文件将来不会重新排列或删除其字形。如果您想保证未来的错误和难以维护的代码,那么在代码中硬编码 glyphID 是一个好主意。否则:不要这样做。

以上是关于我可以在我的代码中硬编码字形索引吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 appSettings.json 中硬编码和读取字符串数组?

为啥在php中硬编码用户名密码安全威胁?

编译后包含在我的 xcode 项目中的 plist 有多安全?

我可以使用其他编码语言生成 html 代码吗?

带有 SSL 的 libWebsockets 服务器不输入 PEM 密码短语

我可以获得我的数据库代码吗?