gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:16:33 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com