我们有一个MFC应用程序,最初是用VC++ 6编写的,经过多年的更新,现在是用VS2017开发的。
应用程序是用MBCS (而不是unicode)构建的。试图切换到Unicode会导致3806编译错误,这可能只是冰山一角。
但是,我们希望能够使用不同的代码页运行应用程序,即。1250 (中欧)。
我试图构建一个小型测试应用程序,并设法让它与特殊字符(čćšđž)一起工作。为此,我将对话框字体设置为,代码页为1250。在我们的应用程序中,同样的方法不起作用。注意:我们的应用程序中的对话框是动态创建的,字体是使用SetFont设置的。
在这两个应用程序中如何处理特殊字符是有区别的。
我相信应用程序中的Edit控件会显示Unicode文本,但是GetWindowText会将其转换为ascii。
有没有人知道这里发生了什么,我该怎么解决?
注意:我知道如何将项目转换为Unicode。我们现在选择不向它投入资源,因为它可能需要几周或几个月才能实施。问题是我如何让它与MBSC一起工作,以及为什么编辑控件将Č转换为C。
发布于 2019-05-22 16:01:37
我相信将应用程序移植到其他语言/代码页是绝对可能的,您只需要修改.rc (资源)文件,基本上每种语言都有一个资源文件,您可能还是希望这样做,因为菜单和/或字符串中的字符串将使用不同的语言。就应用程序部分而言,这实际上是唯一需要的更改。
另一部分是运行它的系统。窗口可以是unicode,也可以是非unicode。您可以在Spyxx实用程序中看到这一点,它告诉您窗口(过程)是否为unicode (窗口属性,General选项卡)。虽然unicode窗口工作正常,但非unicode窗口在获取或设置文本时必须将编码从unicode和mbcs更改为unicode和mbcs。转换基于系统(默认)代码页。这只能是全局设置(对于整个机器),而不是每个应用程序或窗口。当然,设置字体的代码页是不够的(而imo根本不需要它,如果您使用“正确的”代码页在机器上运行应用程序)。也就是说,对于非unicode应用程序,只有一个代码页将正常工作,而其他代码页则不能正常工作。
我可以看到两种选择:
LVM_SETUNICODEFORMAT消息,从而允许使用unicode文本,甚至在mbcs应用程序中也是如此。系统默认代码页可以通过设置"Language程序“选项来更改,该选项可在区域设置、管理选项卡中使用,并需要重新启动。改变Windows语言也会改变这个选项,但是通过设置这个选项你不需要改变UI语言,例如你可以有英语UI和东欧代码页。
请看一个非常类似的帖子这里。
发布于 2022-07-19 07:31:53
晚会晚些时候:
在我们的应用中,所有特殊字符都被正确地呈现,但是GetWindowText (或WM_GETTEXT)将特殊字符转换为类似的ascii对应体(čćđ-> ccd)。
这听起来像是为控件设置了OEMCONVERT标志:
转换在编辑控件中输入的文本。文本将从Windows字符集转换为OEM字符集,然后返回到Windows字符集。当应用程序调用CharToOem函数将编辑控件中的Windows转换为OEM字符时,这将确保正确的字符转换。这种样式对于包含将在不支持Unicode的文件系统上使用的文件名的编辑控件非常有用。 若要在创建控件后更改此样式,请使用SetWindowLong。
https://stackoverflow.com/questions/56255399
复制相似问题