Qt и UTF-8: странное поведение - PullRequest
2 голосов
/ 18 апреля 2011

Для иллюстрации моей проблемы приведу пример:

У меня есть текстовый файл в кодировке 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, поэтому QString и TextStreams работают нормально.

Заранее спасибо.

1 Ответ

2 голосов
/ 18 апреля 2011

Это не ответ , почему это происходит, но делает

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

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

, кажется, это исправить.

...