我们有一个MFC Windows应用程序,最初写在VC 6中,多年来对新的IDE进行了更新,该应用程序目前在VS2017中开发。
该应用程序是用MBC(不是Unicode(构建的。试图切换到Unicode会导致3806编译错误,这可能只是冰山的一尖。
但是,我们希望能够使用不同的代码页面运行该应用程序,即。1250(中欧(。
我试图构建一个小的测试应用程序,并设法使其与特殊角色(čcouphis(一起使用。我通过将Dialog字体设置为Microsoft Sans Serif,并使用代码第1250页进行了此操作。我们应用程序中的同样方法行不通。注意:我们的应用程序中的对话框是动态创建的,并且使用setFont设置字体。
在这两个应用程序中如何处理特殊字符有不同。
- 在测试应用程序中,特殊字符显示在编辑控件中,GetWindowStext检索正确的字节。但是,试图写一些其他语言的字符,将它们呈现为" ????"。
- 在我们的应用程序中,所有特殊字符均正确呈现,但是getWindowText(或wm_getText(将特殊字符转换为相似的ASCII对应物(čć -> ccd(。
我相信我们的应用程序中的编辑控件显示Unicode文本,但是GetWindowText将其转换为ASCII。
有人知道这里发生了什么,以及我如何解决它?
注意:我知道如何将项目转换为Unicode。我们目前选择不为此资源,因为可能需要数周或几个月的实施。问题是我如何与MBSC一起使用,为什么编辑控制转换为c。应用于其他语言/编码,您只需要修改.rc(资源(文件,基本上是每个语言的一个资源文件,您可能还是想做任何一种资源文件,因为菜单和/或字符串表中的字符串将是用不同的语言。就应用程序部分而言,这实际上是唯一需要的更改。
另一部分是您正在运行的系统。窗口可以是Unicode或非单数。您可以使用Spyxx实用程序看到此信息,它告诉您窗口(过程(是否为Unicode(窗口属性,常规选项卡(。虽然Unicode Windows确实可以正常工作,但在获取或设置文本时,非unicode的Windows确实必须从/到Unicode和MBC更改编码。转换基于系统(默认(代码页。这只能在全球(整个机器(中设置,而不是每个应用程序或窗口。当然,设置字体的代码epage还不够(如果您在具有"正确" codepage的计算机上运行该应用程序,则根本不需要IMO(。也就是说,对于非单码应用程序,只有一个代码epage可以正常工作,其他代码均无法正常工作。
我可以看到两个选项:
- 如果您只需要更新少量的控件,则可能只能将这些控件更改为Unicode,并使用GET/SET窗口测试功能或消息的"宽"版本 - 您必须转换Unicode和您所需的编码之间的文本。它需要编写一些代码,但具有转换的优势是独立于系统默认代码,例如,您可以在某些配置文件,注册表中或作为命令行选项中使用codepage(在应用程序的快捷方式中(。某些控制类型可以更改为Unicode,有些则可以将其更改为单位,因此请检查文档。成功地将此技术用于以许多不同语言显示/编辑翻译字符串的MBCS应用程序,但是我只有一个控件,一个列表视图,BTW提供了
LVM_SETUNICODEFORMAT
消息,因此即使在MBCS应用程序中也允许Unicode文本。/li> - 最简单的方法只是按原样运行该应用程序,但它只会像大多数非unicode应用程序一样在具有适当默认编码的机器上工作。
可以通过设置"非unicode程序的语言" 选项来更改系统默认的编码,在区域设置,管理选项卡中可用,并需要重新启动。更改Windows UI语言也将更改此选项,但是通过设置此选项,您不需要更改UI语言,例如,您可以拥有英语UI和East-European Codepage。
请参阅非常相似的帖子此处。
聚会迟到:
在我们的应用程序中,所有特殊字符均正确呈现,但是getWindowText(或wm_getText(将特殊字符转换为相似的ASCII对应物(čć -> ccd(。
。
听起来像已为控件设置了es_oemconvert标志:
转换在编辑控件中输入的文本。文本从Windows字符设置转换为OEM字符集,然后返回到Windows字符集。当应用程序调用ChartOeem函数以将编辑控件中的Windows字符串转换为OEM字符时,这可以确保正确的字符转换。此样式对于包含在不支持Unicode的文件系统上使用的文件名的编辑控件最有用。
要在创建控件后更改此样式,请使用setWindowlong。