Windows如何识别非Unicode应用程序?

5
我正在使用Visual Studio构建一个MFC C++应用程序,并选择了“使用Unicode字符集”。我已经定义了UNICODE,我的CStrings是16位的,我处理包含日语字符的文件名等等。但是,当我将包含日语字符的Unicode字符串放入CComboBox中(使用AddString),它们显示为?????。
我在运行Windows XP Professional x64(英文版)。如果我使用Windows控制面板区域和语言选项,高级选项卡,并将非Unicode程序的语言设置为日语,则我的组合框看起来正确。
因此,我希望我的组合框看起来正确,并且我想了解为什么“非Unicode程序的语言”设置会改变我的Unicode程序的行为。是否有其他事情我应该做来告诉Windows我的应用程序是Unicode应用程序?
谢谢您的任何帮助!
2个回答

7

Windows通过调用的函数来区分Unicode和非Unicode程序。大多数Windows API函数将有两个变体,一个以A结尾表示非Unicode,另一个以W结尾表示Unicode。定义这些函数的包含文件将使用编译器设置自动为您选择其中之一。

字符可能无法正确显示,因为您选择了不包括它们作为默认UI字体的字体。


谢谢,马克。我把“非 Unicode 程序的语言”改回了英语,但我的 CComboBox 仍然看起来正确!我想这个开关安装了一个更大的系统字体,当我回到英语时它被留下了。也许这就是你所说的“默认 UI 字体”?我在这里或 MSDN 上找不到任何其他关于“默认 UI 字体”的参考。 - Mark Gilbert
MFC中使用的“MS Shell Dlg”字体实际上是映射到操作系统默认UI字体的一种方式。请查看此文章以获取更多信息:http://support.microsoft.com/?scid=kb;en-us;282187&x=11&y=13 - djeidot

0

你从哪里获取字符串呢? 如果它们是硬编码在你的C源代码中的,那么在调用AddString时它们很可能已经损坏了。

没有什么能阻止我们将一些Unicode字符串“挤压”到std::string中,并对其进行破坏。即使应用程序被编译为Unicode。


它们是16位的wchar_t字符串,在调试器中看起来没问题。我可以对它们进行任何操作,除了将它们添加到组合框中。 - Mark Gilbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接