MFC CEdit将非ASCII字符转换为ASCII

时间:2019-05-22 11:04:44

标签: c++ visual-c++ unicode mfc mbcs

我们有一个MFC Windows应用程序,该应用程序最初是用VC ++ 6编写的,并且经过多年更新以用于更新的IDE,目前在VS2017中开发。

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

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

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

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

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

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

有人知道这里发生了什么,怎么解决?

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

1 个答案:

答案 0 :(得分:2)

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

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

我可以看到两个选项:

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

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

看到非常相似的帖子here