c++ - MFC CEdit 将非ascii字符转换为ascii

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

我们有一个 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。

最佳答案

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

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

我可以看到两个选项:

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

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

查看非常相似的帖子 here .

关于c++ - MFC CEdit 将非ascii字符转换为ascii,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56255399/

相关文章:

C++ 计算事件的概率

objective-c - 使用 Objective C/Cocoa 对 unicode 字符进行转义,即\u1234

音频和视频控件中暂停符号的 HTML

c++ - 如何在 BYTE 数组中搜索模式?

visual-c++ - 错误 LNK2005 : _exit already defined in msvcrt. lib(MSVCR90.dll)_LIBCMTD.lib?

c++ - 为什么快速排序在重复元素多的情况下效率低下?

c++ - RECT 和 POINT 数组之间的 reinterpret_cast 安全吗?

r - 将希腊字符添加到轴标题

c++ - &array[size] 完全安全吗?

c++ - OpenGL 程序已在 Visual Studio 2015 中以代码 1 退出