我可以在我的代码中硬编码字形索引吗?
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 中硬编码和读取字符串数组?
编译后包含在我的 xcode 项目中的 plist 有多安全?