![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
kin63camapa |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 32 Регистрация: 21.8.2010 Пользователь №: 1976 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Столкнулся со странным поведением QSettings на юникоде, если файл в ascii все ok, cp1251 не детектит, но какбэ и не обязан. Но вот если файл в юникоде парсер делает вид что в файле пусто allKeys().size==0. Сначала думал что он bom не распознаёт, сделал костыль
Раскрывающийся текст
Костыль дал нормальную работу только на utf-8 на UTF-16LE и UTF-16BE QSettings говорит что нет никаких значений у тя в файле, иди лесом. Думаю дай хоть гляну что ему нужно на вход подсовывать:
На выхлопе:
Но и это ещё не все, в созданном файле вообще черт пойми какая кодировка притом без BOM
Собственно вопрос чо делать та? зы и если кто знает как заставить QSettings работать с UTF-7, UTF-8-EBCDIC и SCSU поделитесь, о-о-о-очень надо Сообщение отредактировал kin63camapa - 9.12.2014, 18:58 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Меня реализация QSettings бесит давно и основательно.
Всё что нужно было сделать это конструктор: QSettings ( const QIODevice & iodevice, QObject * parent = 0 ) вместо QSettings ( const QString & fileName, Format format, QObject * parent = 0 ) тогда мы могли бы читать файл в QBuffer предварительно преобразовав кодировку (но внутрянка получается сложнее, поэтому делать так троли не стали). Выход из положения - зарегистрировать свой формат, через registerFormat() по сути создаёшь две функции, чтения и записи из/в файла и регистрируешь их связывая с условным форматом. В функция чтения/записи реализуешь механизм перекодирования. В общем-то не сложно и можно эту кухню вынести в отдельную пару .cpp/.h Сообщение отредактировал Litkevich Yuriy - 9.12.2014, 20:09 |
|
|
lanz |
![]()
Сообщение
#3
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Если посмотреть в исходники, то видно что кодек используется только для кодировки значений ключей
Сами ключи кодируются вот так: Раскрывающийся текст
Так что никак. UTF-8 работает постольку-поскольку его кодировка совпадает с ASCII. Вообще: Цитата Following the philosophy that we should be liberal in what we accept and conservative in what we generate, QSettings will accept Latin-1 encoded INI files, but generate pure ASCII files, where non-ASCII values are encoded using standard INI escape sequences. To make the INI files more readable (but potentially less compatible), call setIniCodec(). Самый близкий workaround:
Цитата Всё что нужно было сделать это конструктор: QSettings ( const QIODevice & iodevice, QObject * parent = 0 ) вместо QSettings ( const QString & fileName, Format format, QObject * parent = 0 ) А как тогда в реестр сохранять? И вообще AppData и т.п. разруливать? QSettings мне как раз нравится тем, что можно завести его и не париться. Но для общего инструмента чтения INI файлов он конечно не очень. Сообщение отредактировал lanz - 9.12.2014, 20:31 |
|
|
kin63camapa |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 32 Регистрация: 21.8.2010 Пользователь №: 1976 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
![]() А ещё с дуру надеялся что он bom сам определяет или даже 8 бит как-нить логически. Самый близкий workaround: это для примера, в проекте ровно наоборот парсится туева хуча сторонних файлов и понасохранять могли в чем угодно, ессно ни одному идиоту не пришло в голову сохранять файло так как это qt делает без bom или кодировку посреди файла менять... щас вот ещё думаю как KOI и 866 детектить парочка таких уже попалась и, цуко, везде кирилица. А как тогда в реестр сохранять? И вообще AppData и т.п. разруливать? QSettings мне как раз нравится тем, что можно завести его и не париться. Но для общего инструмента чтения INI файлов он конечно не очень. Можно просто как нить перегрузить конструктор именно для ини форматата хочешь отдал на откупут тулкиту, хочешь вызвал конкретный конструктор, запхнул туда кодек, имя файла, можно ещё флаги добавить мол игнорим пробелы или нет и т.д. и хоть черта лысого туда записывай, а то блин и инструмент есть и пользы NULL хоть прям сам все кодировки реализуй и собственный ini парсер... |
|
|
Iron Bug |
![]()
Сообщение
#5
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
это совершенно нормально. потому что для параметров программист должен сам выбирать нужную ему кодировку. и вполне возможно, что параметры могут оказаться в разных кодировках. иначе будет ненужное ограничение для разработчиков.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 2.4.2025, 9:13 |