LINUX.ORG.RU

QSettings для кириллицы

 , , ,


1

1

Доброго времени суток. Есть файл в кодировке Windows-1251 следующего содержания:

[bar]
hello=world

[бар]
hello=world

Пытаюсь его прочесть:

QSettings s("/home/vanya/winfolder/foo.txt", QSettings::IniFormat);

QTextCodec* c = QTextCodec::codecForName("CP1251");
s.setIniCodec(c);

qDebug() << s.childGroups();

Получаю ("bar", "áàð") . Если закомментировать строку с указанием кодировки, то вывод тот же. В документации к setIniCodec сказано:

The codec is used for decoding any data that is read from the INI file ... By default, no codec is used, and non-ASCII characters are encoded using standard INI escape sequences.

Чему вообще не соответствует поведение моего кода. Вопрос: как правильно получить значения на русском языке?

Если foo.txt открыть в кодировке latin1, то там будут те же áàð. Тогда для чего я использую функцию setIniCodec? В моем понимании она как раз используется, чтобы правильно конвертировать текст из файла в utf-16. Тогда в чем проблема?


А ты уверен, что косяк с кодировкой происходит в момент чтения из QSettings, а не в момент отладочного вывода через qDebug?

ox55ff ★★★★★ ()
Ответ на: комментарий от aiqu6Ait

Вообще в QWidget. Но если выводить в виджет, то результат тот же

Rot1 ()

сеттингс надо сразу записывать в нужной кодировке, это я про значения, а ключи так вообще в латинице всегда делать

deep-purple ★★★★★ ()
Ответ на: комментарий от ox55ff

Если foo.txt открыть в кодировке latin1, то там будут те же áàð. Тогда для чего я использую функцию setIniCodec? В моем понимании она как раз используется, чтобы правильно конвертировать текст из файла в utf-16. Тогда в чем проблема?

Rot1 ()
Ответ на: комментарий от deep-purple

ini файл не мой, мне его нужно запарсить

Rot1 ()
Ответ на: комментарий от RazrFalcon

Не содержит, с Windows-1251 тот же результат

Rot1 ()

Я все понял. По логиге QSettings кириллицы в ini-файле вообще быть не должно. Кодировку я указываю правильно, она используется, чтобы правильно прочесть из файла что-то вроде %U043F%U0440%U0438%U0432%U0435%U0442=ìèð, а потом уже QSettings приводит это в привет=мир. Получается, что мне не подходит QSettings для парсинга ini файлов...

Rot1 ()
Ответ на: комментарий от Rot1

Qt не знает такой кодировки, поэтому ничего не перекодирует!

Qt uses Unicode to store, draw and manipulate strings. In many situations you may wish to deal with data that uses a different encoding. For example, most Japanese documents are still stored in Shift-JIS or ISO 2022-JP, while Russian users often have their documents in KOI8-R or Windows-1251

Никаких CP1251 в перечне кодеков нет! Только Windows-1251 https://doc.qt.io/qt-5/qtextcodec.html

sigurd ★★★★★ ()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от sigurd

https://github.com/qt/qtbase/blob/13e0a36626bd75e631dd9536e795a494432b1945/src/corelib/codecs/qsimplecodec.cpp#L377
https://github.com/qt/qtbase/blob/13e0a36626bd75e631dd9536e795a494432b1945/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp#L2301

Сильно сомневаюсь, что там не работает псевдоним CP1251 => Windows-1251.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)

Вопрос: как правильно получить значения на русском языке?

Сохранить файл в utf8, обоссать дебила который его составил в однобайтом говне.

anonymous ()
Ответ на: комментарий от EXL

Спасибо, видел. Там Qt древний, с тех времен, когда файлы не были по умолчанию в utf-8. Костылей с кодировками было еще больше. С тех пор логика QSettings могла измениться.

Я написал небольшой парсер, чтобы получить параметры из файла. Достаточно было просто для QTextStream указать все ту же кодироку. Проблем никаких не испытал, что еще раз указывает на то, что QSettings не задумывался для парсинга сторонних файлов

Rot1 ()
Последнее исправление: Rot1 (всего исправлений: 1)
Ответ на: комментарий от Rot1

мне не подходит QSettings для парсинга ini файлов

это как-то странно. Делай ключи на латинице, в Qsettings пиши правильные строки сразу в 1251 и все должно быть ок. Это же просто поток байтов, какая разница, в какой они кодировке?

aiqu6Ait ★★★ ()
Ответ на: комментарий от Rot1

QSettings не задумывался для парсинга сторонних файлов

Это да. Он задумывался для записи значений. Для парсинга есть qbytearray, с ним должно все получиться.

aiqu6Ait ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.