【问题标题】:How does Windows identify non-Unicode applications?Windows 如何识别非 Unicode 应用程序?
【发布时间】:2010-12-11 02:54:23
【问题描述】:

我正在构建一个 MFC C++ 应用程序,并在 Visual Studio 中选择了“使用 Unicode 字符集”。我定义了 UNICODE,我的 CStrings 是 16 位的,我处理其中包含日文字符的文件名,等等。但是,当我将包含日文字符的 Unicode 字符串放入 CComboBox(使用 AddString)时,它们显示为 ????? .

我正在运行 Windows XP Professional x64(英文)。如果我使用 Windows 控制面板区域和语言选项、高级选项卡,并将非 Unicode 程序的语言设置为日语,我的组合框看起来是正确的。

所以,我希望我的组合框看起来正确,并且我想了解为什么“非 Unicode 程序的语言”设置会改变我的 Unicode 程序的行为。我还应该做些什么来告诉 Windows 我的应用程序是 Unicode 应用程序吗?

感谢您的帮助!

【问题讨论】:

    标签: c++ unicode mfc non-unicode


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,马克。我将“非 Unicode 程序的语言”改回英文,但我的 CComboBox 看起来仍然正确!我在想这个开关安装了一个更大的系统字体,当我回到英语时它被遗忘了。也许这就是您所说的“默认 UI 字体”的意思?我在此处或 MSDN 上找不到对“默认 UI 字体”的任何其他引用。
    • MFC中使用的“MS Shell Dlg”字体实际上是对操作系统默认UI字体的映射。查看这篇文章了解更多信息:support.microsoft.com/?scid=kb;en-us;282187&x=11&y=13
    【解决方案2】:

    你从哪里得到字符串? 如果它们在您的 C 源代码中被硬编码,那么在您调用 AddString 时它们(很可能)已经损坏。

    没有什么能阻止人们获取一些 Unicode 字符串,例如将其“挤压”到 std::string 中并损坏它。即使应用程序被编译为 Unicode。

    【讨论】:

    • 它们是 16 位 wchar_t 字符串,它们在调试器中看起来正确。除了将它们添加到组合框之外,我可以对它们做任何事情。
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多