【问题标题】:Qt and UTF-8: strange behaviourQt 和 UTF-8:奇怪的行为
【发布时间】:2011-08-08 01:18:49
【问题描述】:

为了说明我的问题,我举个例子:

我有 UTF-8 编码的文本文件。

in.txt:

ąśćź
ąś
ŻźŹ

此程序逐行读取in.txt 并生成重复的out.txt。 它不仅复制文件,还将其打印到控制台。 最后它会创建QString,其文本与文件的第一行相同。

#include <QtCore>

int main()
{
    QVector<QString> qv;

    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return -1;

    QTextStream in(&file);
    in.setCodec("UTF-8");
    while (!in.atEnd())
    {
        QString line = in.readLine();
        qv.append(line);
    }

    QFile file2("out.txt");
    if (!file2.open(QIODevice::WriteOnly | QIODevice::Text))
        return -1;

    QTextStream out(&file2);
    out.setCodec("UTF-8");
    for (int i = 0; i < qv.size(); ++i)
    {
        //Debugging output
        qDebug() << qv[i];

        out << qv[i] << "\n";
    }

    // Important part!!!

    qDebug() << "Why?";
    QString s("ąśćź"); //same as the first line of file!

    qDebug() << s;
}

控制台输出是个谜:

"????" 
"??" 
"???" 
Why? 
"ąśćź"

out.txt:(重复)

ąśćź
ąś
ŻźŹ

为什么首先打印“??????”复制到控制台,然后在我将“ąśćź”硬编码到我的程序中时打印“ąśćź”?似乎是什么问题? 它创建in.txt 的相同副本,因此QStringTextStreams 工作正常。

提前致谢。

【问题讨论】:

  • 如果您尝试将 in.txt 或 out.txt 直接输出到控制台(使用 cat 之类的东西)会发生什么?
  • 我花了 5 个小时试图弄清楚 qDebug() 的这种奇怪行为 :)
  • qDebug() 用于调试消息,而不是用于正确编码的输出。
  • FWIW,Mac OS X(使用 UTF-8 作为其默认编码)上的输出是:“ąśćź”/“ąś”/“ŻźŹ”/为什么? /“阿阿阿阿”。如果我将最后一个字符串(代码中的那个)更改为QString::fromUtf8("ąśćź"),它们都可以正常打印。
  • 好的,但如果某些东西是用于调试消息的,它应该有更直观的行为,而不是误导。

标签: c++ qt utf-8 stream qdebug


【解决方案1】:

这不是为什么会发生这种情况的答案,而是这样做

for (int i = 0; i < qv.size(); ++i)
{
    //Debugging output
    qDebug() << qv[i].toUtf8();

    out << qv[i] << "\n";
}

似乎可以修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多