У меня есть текстовый файл в кодировке UTF-8, в котором есть такие символы, как ², ³, Ç и ó. Когда я читаю файл, используя приведенное ниже, кажется, что файл читается правильно (по крайней мере, в соответствии с тем, что я вижу в редакторе Visual Studio при просмотре содержимого переменной contents
)
QFile file( filePath );
if ( !file.open( QFile::ReadOnly | QFile::Text ) ) {
return;
}
QString contents;
QTextStream stream( &file );
contents.append( stream.readAll() );
file.close();
Однако, как только содержимое преобразуется в std::string
, добавляются дополнительные символы. Например, ²
преобразуется в ²
, хотя должно быть просто ². Похоже, это происходит для каждого символа, отличного от ANSI, добавляется дополнительный Â
, что, конечно, означает, что при сохранении нового файла символы в выходном файле неверны.
Я, конечно, пытался просто сделать toStdString()
, я также пробовал toUtf8
и даже пытался использовать QTextCodec
, но каждый из них не дает правильных значений.
Я не понимаю, почему переход от файла UTF-8 к QString, а затем к std::string теряет символы UTF-8. Он должен воспроизводить именно тот файл, который был прочитан изначально, или я что-то совсем упустил?
²
(как и ожидалось), при просмотре TextVisualizer для std::string (сразу после вызова toStdString) я вижу²
, так что это до того, как файл будет записан. Я также могу просматривать файлы (до и после) в Notepad ++ в ANSI (который показывает указанные выше символы) и в UTF-8, который показывает²
для исходного файла и²
для нового файла. Похоже, что версия UTF-8 показывает, какой она должна быть для ANSI. - person ChrisMM   schedule 11.07.2019QString
иstd::string
. Кроме того, похоже, чтоQTextStream
готов обрабатывать UTF-16 по умолчанию, если только не появляется спецификация: вы пытались прочитать файл вQByteArray
и использоватьQString::fromUtf8
? Это также имеет дополнительное преимущество, заключающееся в том, что вы четко указываете, что вы делаете с точки зрения кодировки символов. - person Daniel Kamil Kozar   schedule 11.07.2019