1

我们有一个 MFC Windows 应用程序,最初是用 VC++ 6 编写的,多年来针对更新的 IDE 进行了更新,目前在 VS2017 中开发。

该应用程序是用 MBCS(不是 unicode)构建的。尝试切换到 Unicode 会导致 3806 编译错误,这可能只是冰山一角。

但是,我们希望能够使用不同的代码页运行应用程序,即。1250(中欧)。

我尝试构建一个小型测试应用程序,并设法让它与特殊字符 (čćšđž) 一起工作。我通过使用代码页 1250 将对话框字体设置为 Microsoft Sans Serif 来做到这一点。我们的应用程序中的相同方法不起作用。注意:我们应用程序中的对话框是动态创建的,字体是使用 SetFont 设置的。

在这两个应用程序中处理特殊字符的方式有所不同。

  • 在测试应用程序中,特殊字符显示在编辑控件中,GetWindowsText 检索正确的字节。但是,尝试从其他语言编写一些字符时,会将它们呈现为“????”。
  • 在我们的应用程序中,所有特殊字符都被正确渲染,但 GetWindowText(或 WM_GETTEXT)将特殊字符转换为类似的 ascii 对应物(čćđ -> ccd)。

我相信我们应用程序中的 Edit 控件显示 Unicode 文本,但 GetWindowText 将其转换为 ascii。

有谁知道这里发生了什么,以及我该如何解决?

注意:我知道如何将项目转换为 Unicode。我们目前选择不为此投入资源,因为它可能需要数周或数月才能实施。问题是我如何让它与 MBSC 一起工作,以及为什么编辑控件将 Č 转换为 C。

4

1 回答 1

2

我相信绝对有可能将应用程序移植到其他语言/代码页,您只需要修改 .rc(资源)文件,基本上每种语言都有一个资源文件,无论如何您可能更愿意这样做,作为字符串菜单和/或字符串表将使用不同的语言。就应用程序部分而言,这实际上是唯一需要的更改。

另一部分是您运行它的系统。窗口可以是 unicode 或非 unicode。您可以使用 Spyxx 实用程序看到这一点,它会告诉您窗口(过程)是否为 unicode(窗口属性,常规选项卡)。虽然 unicode 窗口确实可以正常工作,但非 unicode 窗口在获取或设置文本时必须从/到 unicode 和 mbcs 更改编码。转换基于系统(默认)代码页。这只能全局设置(对于整个机器),而不是每个应用程序或窗口。当然,仅设置字体的代码页是不够的(如果您在具有“正确”代码页的机器上运行应用程序,则根本不需要它)。也就是说,对于非 unicode 应用程序,只有一个代码页可以正常工作,其他代码页不会。

我可以看到两个选项:

  • 如果您只需要更新少量控件,则可以仅将这些控件更改为 unicode,并使用获取/设置窗口测试功能或消息的“宽”版本 - 您必须转换文本在 unicode 和您想要的代码页之间。它需要编写一些代码,但具有转换独立于系统默认代码页的优点,例如,您可以将代码页放在某些配置文件、注册表中或作为命令行选项(在应用程序的快捷方式中)。有些控件类型可以更改为 unicode,有些则不能,因此请查看文档。将此技术成功地用于 mbcs 应用程序以多种不同语言显示/编辑翻译后的字符串,但我只有一个控件,即 List-View,顺便说一句,它提供了LVM_SETUNICODEFORMAT消息,因此允许使用 unicode 文本,即使在 mbcs 应用程序中也是如此。
  • 最简单的方法是简单地按原样运行应用程序,但它只能在具有正确默认代码页的机器上运行,就像大多数非 unicode 应用程序一样。

可以通过设置“非 Unicode 程序的语言”选项来更改系统默认代码页,该选项可在区域设置的“管理”选项卡中使用,并且需要重新启动。更改 Windows UI 语言也会更改此选项,但通过设置此选项,您无需更改 UI 语言,例如,您可以拥有英语 UI 和东欧代码页。

在这里看到一个非常相似的帖子。

于 2019-05-22T16:01:37.297 回答