【问题标题】:QString to std::string Unicode troubleQString 到 std::string Unicode 麻烦
【发布时间】:2015-04-15 10:47:47
【问题描述】:

在这个简单的代码中,我遇到了 Unicode 问题:

QString qs = QFileDialog::getOpenFileName(0,"","","");
std::string str = qs.toUtf8().constData();
Mat m = imread(str);

当 qs 是拉丁字符集时,它可以正常工作,但是当路径包含西里尔字符时,我会得到一个错误的转换。作为样本: qs "E:/Кирилиця_49.png": str "E:/Кирилиця_49.png"

我知道当 str 不在 UTF-8 字符集上时会发生这种情况,但在项目属性中,“字符集”属性是“使用 Unicode 字符集”。 编译器 MSVC 2010,Qt 5.3.2。 可能是什么问题?

【问题讨论】:

  • QString 以 Unicode 格式保存数据。所以你的转换没问题。它根本不依赖于“使用 Unicode 字符集”属性。你的问题是什么?你能说,你到底哪里有问题?在输出调试 utf 字符串?
  • 问题出在 str 我收到“E:/Кирилиця_49.png”,而不是“E:/Кирилиця_49.png”。我从调试器复制的这个值
  • 为什么不使用QString::toStdString() 或者QString::toStdWString()
  • QString::toStdString() 也返回坏字符。 toStdWString() 工作正常,但在我必须将其转换为 std::string 之后。这可能会产生问题,因为我使用的是 C++ 99 而不是 11,并且程序在 Linux、Windows 和 Android 下运行。

标签: c++ qt unicode qt5 std


【解决方案1】:

我相信QString::toUtf8() 做得对(以 Qt 实现中的一些错误为模...)。

问题可能是您正在为std::string 的内容使用调试器可视化工具,该工具显示使用一些“代码页”而不是Unicode UTF-8 来解释它的字符串。 p>

基本上,字符串内容(作为原始字节)是正确的(它只是与原始 Unicode UTF-16 字符串对应的 UTF-8 字节序列):您只是在使用一些“错误颜色的眼镜”来查看它:)

重点是:imread() 函数期望它的字符串参数是什么格式?如果 imread() 需要一个 UTF-8 字符串,那么您将带有 UTF-8 编码字符串的 std::string 作为参数传递给它是正确的。

【讨论】:

  • > 你只是在用一些“错误颜色的眼镜”看它:)
  • 还可以在调试器中查看正确的字符串 str.c_str (), s8 可以用于 msvc 的情况。
  • > 您只是在使用一些“错误颜色的眼镜”来查看它:) - 不,因为如果路径或文件名包含西里尔字符,则 imread(str) 返回 NULL。我认为 std::string 的代码页不是 utf8。如何将其更改为 utf8?在 qt4 中我制作了 QtextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8")),但在 qt5 中这个函数已经过时了。
  • > str.c_str (), s8 显示正确的字符串。 C64先生是对的。现在下一个问题:为什么 imread 不能与 utf8 字符串一起正常工作?
  • *.com/questions/24769623/… - 我的问题的核心