【问题标题】:Wrong output of qDebug() (UTF - 8)qDebug() 的错误输出 (UTF - 8)
【发布时间】:2013-10-11 14:37:52
【问题描述】:

我正在尝试存储带有特殊字符的字符串::

qDebug() << "ÑABCgÓ";

输出:(在这里我什至无法输入正确的输出,在 Ã & Ã 之后缺少一些垃圾) ÃABCgÃ

我怀疑某些 UTF-8 / Latin1 / ASCII,但找不到输出到控制台/文件的设置。我在我的代码中写的:“ÑABCgÓ”。

(Qt:4.8.5 / Ubunto 12.04 / C++98)

【问题讨论】:

  • 我刚刚在 Qt 程序中尝试了 qDebug()
  • 将其编码为 base64 可能是另一种选择,具体取决于您想要做什么。
  • @Merlin069:我认为这取决于语言环境,所以你很幸运,我也是。:-)

标签: c++ qt utf-8 qt4 qtcore


【解决方案1】:

试试这个:

 QTextCodec *codec = QTextCodec::codecForName("UTF-8");
 QTextCodec::setCodecForCStrings(codec);
 qDebug() << "ÑABCgÓ";

【讨论】:

  • 或使用“QString::fromUTF8”方法
  • 不要*不要*使用它。它不适用于 Qt 5!它在轻松使用 QString 和(在较小程度上)性能问题时产生了不确定性/错误!我建议删除这个违反 Qt 文档的答案。这不应该做广告。
【解决方案2】:

您可以使用QString QString::fromUtf8(const char * str, int size = -1) [static],因为示例代码如下所示。这是QString存在的主要原因之一。

详见文档:

http://qt-project.org/doc/qt-5.1/qtcore/qstring.html#fromUtf8

main.cpp

#include <QString>
#include <QDebug>

int main()
{
    qDebug() << QString::fromUtf8("ÑABCgÓ");
    return 0;
}

构建(根据您的场景定制)

g++ -fPIC -I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core main1000.cpp && ./a.out

输出

"ÑABCgÓ"

话虽如此,根据您的语言环境,只需 qDebug() &lt;&lt; "ÑABCgÓ"; 就可以像这里一样工作,但建议通过明确询问 UTF-8 处理来确保。

【讨论】:

  • @KubaOber:? OP 没有提到 C++11,所以我们不能肯定它是可用的,严格来说:我们甚至不能假设 Qt 5。我的帖子适用于 Qt 4 和 5。
  • 这就是QStringLiteral 的重点:它让您在使用 C++11 的同时保持与 C++98 的兼容性。我只关心你可以有一个版本检查包装#define QStringLiteral(x) QString::fromUtf8(x),这将是最便携的建议,这正是我在我的代码中所做的。
  • 不,实际上如果没有 C++11,QStringLiteral 将无法完全工作。变量通过了,你好?我也说过,QStringLiteral 是在 Qt 5 中才引入的,实际上这里甚至是一个绕过。我不明白这个线程与 QStringLiteral 有什么关系。到目前为止,它通常是关于 Utf 8 和 Qt 的。这正是 QString::utf8() 的设计目的。
  • 我引用了一篇 woboq 博客文章:QStringLiteral 是 Qt 5 中引入的一个新宏,用于从字符串文字创建 QString。 (字符串字面量是源代码中包含的 "" 内的字符串)。我不知道“传递的变量”是什么意思,因为问题不是关于来自变量的字符串,而是来自文字。我们想要的是 QStringLiteral 在非 C++11 上恢复到旧行为 #define QStringLiteral(str) QString::fromUtf8("" str "", sizeof(str) - 1) 的事实:只需切换编译器,代码就能提高效率,耶!
  • @KubaOber:除此之外,文字可能存储在 QString 中。再一次,你做了太多的假设。更不用说,您一直无视 QStringLiteral 仅在 Qt 5 中引入的事实。更重要的是,我不确定 QStringLiteral 与手头的问题有什么关系,即 utf8。 QStringLiteral 是*任何*字符串文字的通用宏。这就是为什么我认为 QStringLiteral 在这里是红鲱鱼。这是我在要求清理之前在线程中的最后一篇帖子......
猜你喜欢
  • 2015-10-26
  • 1970-01-01
  • 2015-09-03
  • 2014-01-27
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多