繁体   English   中英

MFC CEdit 将非 ascii 字符转换为 ascii

[英]MFC CEdit converts non-ascii characters to ascii

我们有一个 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。 转换基于系统(默认)代码页 只能全局设置(针对整个计算机),而不能按每个应用程序或窗口设置。 当然,仅设置字体的代码页是不够的(如果您在使用“正确”代码页的计算机上运行应用程序,则根本不需要imo)。 也就是说,对于非Unicode应用程序,只有一个代码页可以正常工作,而其他代码页则无法正常工作。

我可以看到两个选项:

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

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

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

晚会迟到:

在我们的应用程序中,所有特殊字符都被正确渲染,但 GetWindowText(或 WM_GETTEXT)将特殊字符转换为类似的 ascii 对应物(čćđ -> ccd)。

这听起来像是为控件设置了ES_OEMCONVERT标志:

转换在编辑控件中输入的文本。 文本从 Windows 字符集转换为 OEM 字符集,然后再转换回 Windows 字符集。 当应用程序调用 CharToOem 函数将编辑控件中的 Windows 字符串转换为 OEM 字符时,这可确保正确的字符转换。 此样式对于包含将在不支持 Unicode 的文件系统上使用的文件名的编辑控件最有用。
若要在创建控件后更改此样式,请使用 SetWindowLong。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM