[英]MFC CEdit converts non-ascii characters to ascii
我们有一个 MFC Windows 应用程序,最初是用 VC++ 6 编写的,多年来针对更新的 IDE 进行了更新,目前在 VS2017 中开发。
该应用程序是用 MBCS(不是 unicode)构建的。 尝试切换到 Unicode 会导致 3806 编译错误,这可能只是冰山一角。
但是,我们希望能够使用不同的代码页运行应用程序,即。 1250(中欧)。
我尝试构建一个小型测试应用程序,并设法让它与特殊字符 (čćšđž) 一起工作。 我通过使用代码页 1250 将对话框字体设置为 Microsoft Sans Serif 来做到这一点。我们的应用程序中的相同方法不起作用。 注意:我们应用程序中的对话框是动态创建的,字体是使用 SetFont 设置的。
在这两个应用程序中处理特殊字符的方式有所不同。
我相信我们应用程序中的 Edit 控件显示 Unicode 文本,但 GetWindowText 将其转换为 ascii。
有谁知道这里发生了什么,以及我该如何解决?
注意:我知道如何将项目转换为 Unicode。 我们目前选择不为此投入资源,因为它可能需要数周或数月才能实施。 问题是我如何让它与 MBSC 一起工作,以及为什么编辑控件将 Č 转换为 C。
我相信绝对有可能将应用程序移植到其他语言/代码页,您只需要修改.rc(资源)文件,基本上每种语言都有一个资源文件,无论如何您都希望这样做,例如字符串菜单和/或字符串表将使用其他语言。 就应用程序部分而言,这实际上是唯一需要的更改。
另一部分是您正在其上运行的系统。 窗口可以是unicode或非unicode。 您可以使用Spyxx实用程序看到此信息,它告诉您窗口(过程)是否为unicode(“窗口属性”,“常规”选项卡)。 尽管unicode窗口可以正常工作,但非unicode窗口必须在获取或设置文本时将编码更改为unicode和mbcs。 转换基于系统(默认)代码页 。 只能全局设置(针对整个计算机),而不能按每个应用程序或窗口设置。 当然,仅设置字体的代码页是不够的(如果您在使用“正确”代码页的计算机上运行应用程序,则根本不需要imo)。 也就是说,对于非Unicode应用程序,只有一个代码页可以正常工作,而其他代码页则无法正常工作。
我可以看到两个选项:
LVM_SETUNICODEFORMAT
消息,因此即使在mbcs应用程序中也可以使用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.