字形到unicode字符串翻译

时间:2014-06-19 15:20:05

标签: winapi fonts gdi glyph

给定特定字体的字形索引,我需要获得字形的unicode转换。为了构建一个字形到unicode的翻译,我使用GetGlyphIndices作为整个unicode范围,从结果我构建了反向翻译(字形到unicode字符映射)。但是,这给了我单个字形与单个unicode字符之间的转换,我可以看到,例如,在印地语中,两个unicode字符可以用一个字形表示。

例如,在namaste(नमस्ते)这个词中,有6个unicode字符,由5个字形表示(中间两个unicode字符由一个字形表示)。我可以通过附加到notepad.exe,在ExtTextOut中插入一个断点并从记事本中打印这个单词来看到这一点。

有什么方法可以将字形翻译成unicode字符串(如果字形代表多个unicode字符)?

1 个答案:

答案 0 :(得分:2)

1)对于所有但非常简单的情况,您应该使用Uniscribe函数(而不是GetGlyphIndices)将字符串(Unicodes序列)转换为字形。这在GetGlyphIndices的文档中有所说明:http://msdn.microsoft.com/en-us/library/windows/desktop/dd144890(v=vs.85).aspx

2)没有办法可靠地为所有情况做你想做的事。即使是大多数情况。这是称为复杂脚本整形的结果,它将一系列输入Unicodes转换为一系列输出字形。这是使用字体数据中的许多表来完成的。最感兴趣的两个是cmap和GSUB。

cmap将Unicode值映射到特定于字体的字形。 cmap可以指定映射到单个字形的多个Unicode(多映射)。这是许多字体中常用的方案。此外,字体中的许多字形甚至可能不会映射到cmap中。因此,仅凭这一点,您就无法将字形可靠地反向映射为单个Unicode。

但它变得更加困难:GSUB可以指定许多规则,并且可以将一个输入字形转换为多个输出字形,或者将一系列输入字形转换为一个输出字形。它甚至可以指定转换发生的上下文(例如,它可能会说"转换' A' B'但仅限于' A'前面是''",因此CA - > CB但DA - > DA)。在某些情况下,特别是印地语和其他印度语,输出字形序列甚至可能与逻辑Unicode输入序列的顺序不同。最终结果是字形的输出序列可以映射回单个Unicode或多个Unicode,或者根本不映射。有可能解码GSUB的规则+脚本整形引擎的逻辑来缩小一点(冒险不适合精神的弱点!),但问题仍然是多个输入的Unicodes可能会结束解析为相同的输出字形。

结论:最好查看转换字符串的过程 - >字体特定的字形作为单向行程。

为了更好地理解这些概念,我强烈建议您阅读Windows中实现的复杂脚本整形:http://www.microsoft.com/typography/otspec/TTOCHAP1.htm。至于应用程序中的编码,Uniscribe参考也提供了非常丰富的信息:http://msdn.microsoft.com/en-us/library/windows/desktop/dd374091(v=vs.85).aspx