#196 closed баг (fixed)
Логи программы выводятся в файл в кодировки, отличной от кодировки локали
Reported by: | alx | Owned by: | dimag |
---|---|---|---|
Priority: | minor | Milestone: | 2 очередь |
Component: | ПО MC04-Dispatcher. Пульт диспетчера/техника | Keywords: | Log Encoding |
Cc: | san |
Description
Сейчас ProgLogger выводит в файл сообщения в той кодировке, в какой их получает - Windows-1251. Эта кодировка может не совпадать с кодировкой локали.
Надо при выводе в файл перекодировать текст в кодировку локали (если это возможно).
Change History (8)
follow-up: 2 comment:1 by , 9 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:2 by , 9 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
В ревизии r230 баг по-прежнему присутствует.
Replying to dimag:
Возможно в вашей версии Linux кодировка по умолчанию отличная от UTF-8, которая используется по умолчанию в моём дистрибутиве.
На самом деле не важно, какая где кодировка по умолчанию. Есть текущая локаль и ее кодировка. Ввод/вывод текста должен выполняться программой в той кодировке, которая установлена в текущий момент (точнее, в момент запуска программы). В моем случае кодировка локали была UTF-8:
alx@voip$ echo $LANG ru_RU.UTF-8
Однако программа все равно выводит текст в лог-файл main.log в кодировке Windows-1251.
И ничего удивительного в этом нет, ибо в функции
MainAppFrameWindow3::LogOutput() явным образом все строки перекодируются в Windows-1251 (кстати, Вы тут изобрели велосипед, в виде функции XMLConfig::utf8_to_win1251(), тогда как в библиотеке Qt есть готовые средства для этого - см. класс QTextCodec, который, в свою очередь, использует libiconv), а затем передаются в pLogger.info(), которая без изменений пишет их в файл.
Я считаю, что либо в ProgLogger::info() (а также ProgLogger::warning() и ProgLogger::error()) выводимый в лог-файл текст надо перекодировать в кодировку локали, либо оставить кодировку UTF-8 как наиболее используемую и (в отличие от Windows-1251) способную представить любые символы.
Я добавил следующую строку в начало функции main.
QTextCodec *pCodec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(pCodec);
Он (кодек библиотеки Qt) как не использовался, так и не используется сейчас - см. выше. А должна использоваться кодировка локали. Если у пользователя локаль UTF-8, лог-файл должен кодироваться в UTF-8. Если CP-1251 - в CP-1251. Если в KOI8-R - в KOI8-R...
comment:3 by , 8 years ago
После некоторого размышления я склоняюсь к мысли, что (по крайней мере, пока у нас не будут сделаны переводы на другие языки) лучше выводить в лог-файл всегда в UTF-8 и игнорировать установки локали, так как у нас в программе "hardcoded" вывод строк с кириллицей, которая может отсутствовать в кодировке локали.
comment:4 by , 8 years ago
Вопрос к Александру.
В какой кодировке лучше сохранять лог CP1251(можно без проблем открывать в Notepad под Windows) или UTF-8(Notepad выведед непонятные символы, но Ubuntu Kate откроет данный текст без проблем) или задавать кодировку лога в экране настроек?
follow-up: 6 comment:5 by , 8 years ago
Два варианта сохранения лога 1)в локальной кодировке возвращаемой QTextCodec *QTextCodec::codecForLocale()2)В UTF-8
Вариант выбирается в экране настроек программы.
comment:6 by , 8 years ago
Replying to dimag:
Два варианта сохранения лога
1)в локальной кодировке возвращаемой QTextCodec *QTextCodec::codecForLocale()
2)В UTF-8
Вариант выбирается в экране настроек программы.
Да, так и сделаем.
comment:7 by , 8 years ago
Keywords: | Log Encoding added |
---|---|
Resolution: | → fixed |
Status: | reopened → closed |
r230
Возможно в вашей версии Linux кодировка по умолчанию отличная от UTF-8, которая используется по умолчанию в моём дистрибутиве.
Я добавил следующую строку в начало функции main.
QTextCodec *pCodec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(pCodec);
Теперь везде должен использоваться одинаковый кодек для кодировок.