Qt和UTF-8:奇怪的行为

时间:2011-04-18 16:59:06

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

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

我有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可以正常工作。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

似乎解决了这个问题。