QFile && QTextStream: как читать файл cp1251 построчно?
В Qt6 был депрекирован QTextCodec, и теперь нужно использовать QStringConverter. Но QStringConverter не имеет поддержки cp1251 (или я проглядел?), что заставляет возвращаться к QTextCodec. Но вот класс QTextStream раньше имел метод setCodec, а теперь не имеет, даже в режиме совместимости с Qt5. А только setEncoding(QStringConverter::Enconding), который не работает с cp1251.
А в более глобальных смыслах, мне нужно было процедурку чтения файла по строчно, которая работает примерно так:
QFile file(fn);
file.open(QIODevice::ReadOnly|QIODevice::Text);
QTextStream in(&file);
in.setCodec("cp1251");
while (!in.atEnd())
task(in.readLine());
Как в Qt6 прочитать файл средствами этого Qt в кодировке cp1251 и в других кодировках как было в Qt5 построчно?
Ответы (1 шт):
У меня нет qt6, чтобы проверить, но вы всё ещё можете читать строки в QByteArray и вручную использовать на них QTextCodec.
Например:
QFile file("myfile.txt");
file.open(QIODevice::ReadOnly|QIODevice::Text);
QStringList list;
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
while (true) {
QByteArray arr = file.readLine();
if (arr.size() > 0) {
list << codec->toUnicode(arr);
} else {
break;
}
}
А ещё обратите внимание, что QStringConverter::System использует системную кодировку, что можно использовать в некоторых ситуациях. Результат работы в таком случае будет аналогичен вызову QString::fromLocal8Bit(arr), т.к. этот метод в qt6 использует QStringDecoder с вышеуказанным параметром.