qDebug()输出错误(UTF-8)

4

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

qDebug() << "ÑABCgÓ";

输出结果:(这里我甚至无法输入正确的输出,一些垃圾字符在“à & Ô后面丢失了)

我怀疑是UTF-8 / Latin1 / ASCII编码问题,但找不到设置将其输出到控制台 / 文件的方法。我在代码中写的是:“ÑABCgÓ”。

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


我刚在一个Qt程序中尝试了qDebug() << "ÑABCgÓ",输出结果如预期。我正在使用OSX,你是在Windows上尝试吗? - TheDarkKnight
将其编码为base64可能是一种选择,具体取决于您想要做什么。 - bh42
@Merlin069:我认为这取决于地区,所以你很幸运,我也是。 :-) - László Papp
2个回答

4
您可以使用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() << "ÑABCgÓ";也可能有效,但建议通过显式要求UTF-8处理来确保。


@KubaOber: ? OP 没有提到 C++11,所以我们不能确定它肯定可用,严格来说:我们甚至不能假设 Qt 5 可用。我的帖子可以在 Qt 4 和 5 中使用。 - László Papp
这就是“QStringLiteral”的全部意义所在:它为您提供了C++11的好处,同时保持与C++98的兼容性。就我而言,您可以有一个版本检查包装的#define QStringLiteral(x) QString::fromUtf8(x),这将是最便携的建议,这正是我在我的代码中所做的。 - Kuba hasn't forgotten Monica
不,实际上QStringLiteral没有C++11是无法完全工作的。变量传递,你好吗?正如我所说,QStringLiteral仅在Qt 5中引入,并且实际上这里甚至是一个绕过。我不明白这个线程与QStringLiteral有什么关系。到目前为止,它与Utf 8和Qt有关。这正是QString :: utf8()的设计目的。 - László Papp
我引用woboq博客文章中的一句话:* QStringLiteral是Qt 5中引入的新宏,用于从字符串字面量创建QString。(字符串字面量是源代码中包含在""中的字符串)*。我不知道你所说的“传递变量”的意思,因为问题不是关于从变量而是从字面量获取字符串的。QStringLiteral在非C++11上恢复到旧行为#define QStringLiteral(str) QString::fromUtf8("" str "", sizeof(str) - 1)正是我们想要的:通过切换编译器,代码就能获得效率提升,太棒了! - Kuba hasn't forgotten Monica
@KubaOber:除此之外,字面量可能存储在QString中。你做出了太多的假设。更不用说,你一直忽略了QStringLiteral只在Qt 5中引入的事实。更重要的是,我不确定QStringLiteral与手头的问题utf8有什么关系。QStringLiteral是任何字符串字面量的通用宏。这就是为什么我认为QStringLiteral在这里是一个误导。在请求清理之前,这是我在该线程中的最后一篇文章... - László Papp

1

试试这个:

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

2
或者使用"QString::fromUTF8"方法 - ratchet freak
2
不要使用它。在Qt 5中不可用!它会导致QString的使用不确定性/错误(在较小程度上也会影响性能问题)!我建议删除这个回答,因为它违反了Qt文档。这不应该被宣传。 - László Papp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接