Winapi 窗口标题中的Unicode字符

Winapi 窗口标题中的Unicode字符,winapi,unicode,localization,internationalization,Winapi,Unicode,Localization,Internationalization,我们无法使用西里尔或日语字符设置窗口标题。我们要么看到问号,要么看到随机垃圾,但看不到我们想要的文本。我们尝试过使用不同的编码,SetWindowText()、SetWindowTextW()、SetWindowTextA()等等。我们甚至无法通过将字符串文本传递给SetWindowText()使其工作 我们的Windows安装似乎有它所需要的一切——例如,Internet Explorer和Firefox确实正确显示西里尔文和日文标题。所以我很确定我们没有找到正确的编码/方法组合。有什么建议吗

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


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

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

SetWindowText()
?您是否将应用程序编译为Unicode?如果不是,SetWindowText()相当于
SetWindowTextA()
,而这反过来又限于您当前的系统语言环境(也称为“非Unicode应用程序的语言”)

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

如果您的程序未编译为Unicode,则可能需要在CP/Regional选项中修改“非Unicode应用程序的语言”。需要重新启动。或者更简单:用于模拟西里尔语系统区域设置

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

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

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


如果这一切听起来非常复杂,那么你没有错…

我们最终使用了MultiByteToWideChar(),但我们不知道AppLocale。它非常有用!