首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MFC CEdit将非ascii字符转换为ascii。

MFC CEdit将非ascii字符转换为ascii。
EN

Stack Overflow用户
提问于 2019-05-22 11:04:43
回答 2查看 452关注 0票数 2

我们有一个MFC应用程序,最初是用VC++ 6编写的,经过多年的更新,现在是用VS2017开发的。

应用程序是用MBCS (而不是unicode)构建的。试图切换到Unicode会导致3806编译错误,这可能只是冰山一角。

但是,我们希望能够使用不同的代码页运行应用程序,即。1250 (中欧)。

我试图构建一个小型测试应用程序,并设法让它与特殊字符(čćšđž)一起工作。为此,我将对话框字体设置为,代码页为1250。在我们的应用程序中,同样的方法不起作用。注意:我们的应用程序中的对话框是动态创建的,字体是使用SetFont设置的。

在这两个应用程序中如何处理特殊字符是有区别的。

  • 在测试应用程序中,特殊字符显示在编辑控件中,GetWindowsText检索正确的字节。然而,试图从其他语言中写一些字符,将它们呈现为“?”。
  • 在我们的应用中,所有特殊字符都被正确地呈现,但是GetWindowText (或WM_GETTEXT)将特殊字符转换为类似的ascii对应体(čćđ-> ccd)。

我相信应用程序中的Edit控件会显示Unicode文本,但是GetWindowText会将其转换为ascii。

有没有人知道这里发生了什么,我该怎么解决?

注意:我知道如何将项目转换为Unicode。我们现在选择不向它投入资源,因为它可能需要几周或几个月才能实施。问题是我如何让它与MBSC一起工作,以及为什么编辑控件将Č转换为C。

EN

回答 2

Stack Overflow用户

发布于 2019-05-22 16:01:37

我相信将应用程序移植到其他语言/代码页是绝对可能的,您只需要修改.rc (资源)文件,基本上每种语言都有一个资源文件,您可能还是希望这样做,因为菜单和/或字符串中的字符串将使用不同的语言。就应用程序部分而言,这实际上是唯一需要的更改。

另一部分是运行它的系统。窗口可以是unicode,也可以是非unicode。您可以在Spyxx实用程序中看到这一点,它告诉您窗口(过程)是否为unicode (窗口属性,General选项卡)。虽然unicode窗口工作正常,但非unicode窗口在获取或设置文本时必须将编码从unicode和mbcs更改为unicode和mbcs。转换基于系统(默认)代码页。这只能是全局设置(对于整个机器),而不是每个应用程序或窗口。当然,设置字体的代码页是不够的(而imo根本不需要它,如果您使用“正确的”代码页在机器上运行应用程序)。也就是说,对于非unicode应用程序,只有一个代码页将正常工作,而其他代码页则不能正常工作。

我可以看到两种选择:

  • 如果您只需要更新少量控件,则可能只需要将这些控件更改为unicode,并使用get/set窗口的“宽”版本--测试函数或消息--您将不得不在unicode和所需的代码页之间转换文本。它需要编写一些代码,但它的优点是转换独立于系统默认代码页,例如您可以在某些配置文件、注册表中或命令行选项(在应用程序的快捷方式中)中拥有代码页。有些控件类型可以更改为unicode,有些则不能,因此请检查文档。在mbcs应用程序中成功地使用了这种技术,它以多种语言显示/编辑翻译的字符串,但我只有一个控件,即列表视图,它提供了LVM_SETUNICODEFORMAT消息,从而允许使用unicode文本,甚至在mbcs应用程序中也是如此。
  • 最简单的方法是按原样运行应用程序,但它只能在具有适当默认代码页的机器上工作,就像大多数非unicode应用程序所做的那样。

系统默认代码页可以通过设置"Language程序“选项来更改,该选项可在区域设置、管理选项卡中使用,并需要重新启动。改变Windows语言也会改变这个选项,但是通过设置这个选项你不需要改变UI语言,例如你可以有英语UI和东欧代码页。

请看一个非常类似的帖子这里

票数 2
EN

Stack Overflow用户

发布于 2022-07-19 07:31:53

晚会晚些时候:

在我们的应用中,所有特殊字符都被正确地呈现,但是GetWindowText (或WM_GETTEXT)将特殊字符转换为类似的ascii对应体(čćđ-> ccd)。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56255399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档