【问题标题】:VerQueryValue and multi codepage Unicode charactersVerQueryValue 和多代码页 Unicode 字符
【发布时间】:2009-10-05 10:58:22
【问题描述】:

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

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 并查看“详细信息”选项卡,它会正确显示产品名称!因此,微软似乎使用了不同的 API 调用或以某种方式 正确处理。我需要知道它是怎么做到的。

提前致谢,

文卡特

【问题讨论】:

    标签: unicode winapi


    【解决方案1】:

    仅在标记为 codepage2 的块中具有与 codepage1 兼容的内容看起来有些奇怪。这就是问题的根源。

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

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

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

    关于在控制台中显示的注意事项

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

    HTH。

    【讨论】:

    • 谢谢!我尝试使用“使用 Unicode 字符集”在 VC++ 中编译代码,以便 UNICODE 和 _UNICODE 宏是#define'd。它仍然无法正常工作。此外,版本信息中只有一个语言块,并且混合了多代码页序列 - 正如您所说,这是根本原因。但我只是想知道 MS 如何在“属性对话框”中正确显示字符并想模仿它。
    • 如果 MS 指的是 Windows 资源管理器,那么使用 Unicode 就是他们使用的解决方案!将程序编译为 Unicode 时,什么“不能正常工作”?
    • 是的,我指的是 Winodws Explorer;当我的意思是“它不能正常工作”时,是一些字符没有显示在控制台中,而在资源管理器的属性对话框中也是如此
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2015-03-05
    • 2018-11-18
    相关资源
    最近更新 更多