VerQueryValue和多代码页Unicode字符

时间:2009-10-05 10:58:22

标签: unicode winapi

在我们的应用程序中,我们使用VerQueryValue()API调用来获取诸如ProductName等的版本信息。对于在繁体中文(代码页950)的机器上运行的某些应用程序,具有跨越多个代码页的Unicode序列的ProductName,某些字符未正确翻译。例如,在下面的序列中,

51 00 51 00 6F 8F F6 4E A1 7B 06 74 某些字符作为无效的Unicode 0x003f(问号)返回

在上面的序列中,没有选择Unicode'8F 6F'和&通过WinAPI调用正确转换,并且只填充了无效的Unicode '00 3F' - 因为'8F 6F'仅存在于代码页936中(即简体中文)

.exe只有一个转换表 - '\ StringFileInfo \ 080404B0' - 仅指繁体中文的语言ID'804'

如何处理这种情况 - 即使翻译表只有一个条目,ProductName也会引用936和950中的Unicode?是否还有其他API调用?

另外,如果我右键单击exe并查看“详细信息”选项卡,它会正确显示产品名称!因此,似乎Microsoft使用不同的API调用或以某种方式 正确处理。我需要知道它是如何完成的。

提前致谢,

Venkat

1 个答案:

答案 0 :(得分:0)

只有在标记为codepage2的块中才能使内容与codepage1兼容。这是你问题的根源。

处理多代码页问题的最佳方法显然是将您的应用程序转换为支持Unicode的应用程序。将不再转换为任何代码页,这将使每个人都满意。

LANGID(0804)仅表示块中内容的语言。如果版本信息包含多个块,您可以对应用进行编程,以用您用户的语言查找块。

在ANSI应用程序中调用VerQueryValue()时,在将Unicode内容转换为ANSI时不考虑此LANGID:您是ANSI,因此Windows假定您只了解机器的默认ANSI代码页。

关于在控制台中显示的说明

小心控制台!这是一个不完全支持Unicode的旧生物。它基于代码页。因此,您应该期待无法解决的显示问题。更糟糕的是:它使用自己的代码页(称为OEM代码页),这可能与通常的ANSI代码页不同(虽然对于东亚语言,OEM代码页= ANSI代码页)。

HTH。