Как прочитать текст UTF-8 из файла с помощью Qt?

У меня есть некоторые проблемы с чтением текста в кодировке UTF-8 из файла. Моя версия читает только символы ASCII.

#include <QtCore>

int main()
{
    QFile file("s.txt");

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return -1;
    }

    QTextStream in(&file);
    while(!in.atEnd())
    {
        QString line = in.readLine();
        qDebug() << line;
    }
}

s.txt:

jąkać się
ślimak
śnieżyca

выход:

"jka si" 
"limak" 
"nieyca"

Что я должен использовать?


person Maciej Ziarko    schedule 12.04.2011    source источник


Ответы (3)


См. QTextStream::setCodec():

in.setCodec("UTF-8");
person John Flatness    schedule 12.04.2011
comment
Я попробовал, и теперь все символы, отличные от ASCII, заменены на ?. - person Maciej Ziarko; 12.04.2011
comment
Возможно, ваша консоль вывода qDebug не поддерживает эти символы. Это было бы разумным источником ?. Попробуйте отобразить строку в QLabel на экране. - person edA-qa mort-ora-y; 12.04.2011
comment
Это не проблема. dDebug() ‹‹ QString(śnieżyca); работает отлично. - person Maciej Ziarko; 12.04.2011
comment
Вы уверены, что ваш входной файл на самом деле UTF-8? - person John Flatness; 12.04.2011
comment
4 текстовых редактора (Geany, jEdit, gedit, Kate) говорят, что это UTF-8. И все же у меня есть проблема с ?. - person Maciej Ziarko; 12.04.2011
comment
Хорошо, в конце концов это решило мою проблему. Спасибо! - person Maciej Ziarko; 18.04.2011

Вы должны сделать:

QTextStream in(&file);
in.setCodec("UTF-8"); // change the file codec to UTF-8.

while(!in.atEnd())
{
    QString line = in.readLine();
    qDebug() << line.toLocal8Bit(); // convert to locale multi-byte string 
}
person Yi Zhao    schedule 12.04.2011
comment
После него получаю: j?ka? си? ?limak ?nie?yca - person Maciej Ziarko; 12.04.2011
comment
Какая у вас локаль по умолчанию? Если qDebug() << QString("śnieżyca"); работает отлично, это означает, что в вашей системе настроена локаль, отличная от ASCII. Вы должны попробовать qDebug() << line.toLocal8Bit(); - person Yi Zhao; 12.04.2011

У меня также было ???? при чтении файла XML с помощью QXmlStreamReader. Я исправил это, вызвав это перед чтением файла:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
person laurent    schedule 20.12.2016