【问题标题】:using CListCtrl to display utf-8 characters使用 CListCtrl 显示 utf-8 字符
【发布时间】:2015-02-23 04:39:07
【问题描述】:

在过去的几个小时里,我试图在我的 CListCtrl 中显示文本,但没有成功。 我正在使用std::ifstream 从使用utf-8 填充CListCtrl 的.txt 文件中读取。

“项目属性->字符”设置为“未设置”,我无法将其更改为使用Unicode,这是一个旧项目,最初不是我写的。

从 UTF-8 到 ANSI 的转换也不起作用,我不能使用 boost 库。 当我读到 CListCtrl 不支持 UTF-8 时。

我很高兴听到任何可能有效的解决方案,扩展 CListCtrl 以替换旧的等等。我正在使用 VS2010、.NET4。

【问题讨论】:

  • Windows 不支持 UTF-8。您需要使用外部库将 UTF-8 转换为 UTF-16。如果您有可用的 C++11,那么可以使用标准库来完成。
  • 没试过(我没有windows box),但LVITEM实际上是你构建中的一个LVITEMA。您可以直接设置LVITEMW,使用MultiByteToWideChar(CP_UTF8,...) 并在宽版本LVITEMW 中设置宽字符文本。很久没有修改 ListView 控件了,但值得一试。
  • @МишаСухов:请注意,在任何与代码或首字母缩写词略有相似之处添加代码标记并不是一种改进。您之前的一些编辑已恢复。您还错过了许多其他改进的机会,例如语法问题。

标签: c++ unicode encoding utf-8 mfc


【解决方案1】:

您需要使用 Unicode 版本的列表视图 API(例如 LVM_SETITEMW)。 MBCS 版本的 MFC 调用 ANSI 版本的 Windows API,这可能无法在您的文件中显示某些 Unicode 字符。

这意味着例如,如果您想更改项目,则需要发送带有 LVITEMW 结构的 LVM_SETITEMW 消息。如果您有许多列表控件要更改,您可能可以使用 MFC 的代码作为参考编写一个 CListCtrlW 类。 LVITEMW 期望字符串为 UTF-16,因此您需要将字符串数据转换为 UTF-16。您可以使用 CP_UTF8 代码页通过 MultiByteToWideChar 或 CA2W 执行此操作。此外,如果您使用的字体无法处理输入中的某些 Unicode 字符,则需要更改字体。

如果 UI 中的很多地方都需要处理 Unicode 输入,您可以尝试将业务逻辑的 ANSI 部分移到 DLL 中,然后将您的主 exe 项目更改为 Unicode。

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 2011-07-28
    • 2011-11-04
    • 2013-04-09
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多