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

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

有帮助吗?

解决方案

<代码> SetWindowText函数()?您是否将应用程序编译为Unicode?如果没有,SetWindowText()等同于 SetWindowTextA(),而后者又限于您当前的系统区域设置(也称为“非Unicode应用程序的语言”)。

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

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

其他提示

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

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

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

如果所有这些听起来都非常复杂,那你就错了......

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top