【问题标题】:Unicode characters in window caption窗口标题中的 Unicode 字符
【发布时间】:2009-01-06 15:40:48
【问题描述】:

我们在使用西里尔文或日文字符设置窗口标题时遇到问题。我们要么看到问号,要么看到随机垃圾,但看不到我们想要的文本。我们尝试过使用不同的编码,SetWindowText()、SetWindowTextW()、SetWindowTextA() 等等。我们甚至无法通过将字符串文字传递给 SetWindowText() 来使其工作。

我们的 Windows 安装似乎拥有所需的一切 - 例如,Internet Explorer 和 Firefox 确实可以正确显示西里尔文和日文字幕。所以我很确定我们没有找到正确的编码/方法组合。有什么建议吗?

【问题讨论】:

    标签: winapi unicode localization internationalization


    【解决方案1】:

    您遇到的问题(猜测)是您的应用程序的顶级框架窗口是一个 ANSI 窗口。在后台,当您创建一个窗口(使用 CreateWindow() 或 CreateWindowEx())时,必须提供一个窗口类。该窗口类确定窗口的属性,包括默认情况下是否接受 ANSI 消息或 Unicode 消息。反过来,这取决于您(或您的框架)是通过调用 RegisterClassExA() 还是 RegisterClassExW() 来注册窗口类。

    几乎可以肯定的是,您的顶级窗口的类正在使用 RegisterClassExA() 注册。这意味着窗口的默认窗口过程将在处理消息之前将消息中的所有 Unicode 字符串转换为 ANSI,因此到处都是问号和奇数字符。

    解决所有这些问题的最简单方法是让您的应用程序始终使用 Unicode(通常通过定义 _UNICODE 来完成)。另一种方法是找出 RegisterClassEx() 被调用的位置,并将其设为 RegisterClassExW()。这可能会导致其他消息出现 ANSI/Unicode 问题,但它应该(至少在理论上)可以工作。当然,如果这是个问题,任何一种方式都会破坏 Windows 9X。

    如果这一切听起来复杂得可怕,那你就没有错……

    【讨论】:

      【解决方案2】:

      SetWindowText()?您是否将应用程序编译为 Unicode?如果不是,则 SetWindowText() 等效于 SetWindowTextA(),而这又受限于您当前的系统区域设置(也称为“非 Unicode 应用程序语言”)。

      另外,你是如何创建你的窗口的?使用明确的 Unicode 感知 API,例如 CreateWindowExW()?如果不是,请确保您的程序编译为 Unicode。

      如果您的程序未编译为 Unicode,您可能需要在 CP/Regional Options 中修改“非 Unicode 应用程序的语言”。需要重启。或者更简单:使用MS AppLocale 模拟西里尔系统语言环境

      【讨论】:

      • 我们最终使用了 MultiByteToWideChar() 但我们不知道 AppLocale。非常有用!
      【解决方案3】:

      您必须使用定义的 _UNICODE 来编译您的应用程序。否则所有窗口仍将是 MBCS 而不是 utf-16,因此如果代码页不匹配,则无法显示西里尔文或日文字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        • 2015-03-05
        • 1970-01-01
        • 2012-10-29
        • 2019-05-13
        • 1970-01-01
        相关资源
        最近更新 更多