Opened 9 years ago

Closed 8 years ago

Last modified 7 years ago

#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)

comment:1 by dimag, 9 years ago

Resolution: fixed
Status: newclosed

r230
Возможно в вашей версии Linux кодировка по умолчанию отличная от UTF-8, которая используется по умолчанию в моём дистрибутиве.
Я добавил следующую строку в начало функции main.
QTextCodec *pCodec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(pCodec);
Теперь везде должен использоваться одинаковый кодек для кодировок.

in reply to:  1 comment:2 by alx, 9 years ago

Resolution: fixed
Status: closedreopened

В ревизии 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...

Last edited 8 years ago by alx (previous) (diff)

comment:3 by alx, 8 years ago

После некоторого размышления я склоняюсь к мысли, что (по крайней мере, пока у нас не будут сделаны переводы на другие языки) лучше выводить в лог-файл всегда в UTF-8 и игнорировать установки локали, так как у нас в программе "hardcoded" вывод строк с кириллицей, которая может отсутствовать в кодировке локали.

comment:4 by dimag, 8 years ago

Вопрос к Александру.
В какой кодировке лучше сохранять лог CP1251(можно без проблем открывать в Notepad под Windows) или UTF-8(Notepad выведед непонятные символы, но Ubuntu Kate откроет данный текст без проблем) или задавать кодировку лога в экране настроек?

comment:5 by dimag, 8 years ago

Два варианта сохранения лога 1)в локальной кодировке возвращаемой QTextCodec *QTextCodec::codecForLocale()2)В UTF-8
Вариант выбирается в экране настроек программы.

in reply to:  5 comment:6 by san, 8 years ago

Replying to dimag:

Два варианта сохранения лога
1)в локальной кодировке возвращаемой QTextCodec *QTextCodec::codecForLocale()
2)В UTF-8
Вариант выбирается в экране настроек программы.

Да, так и сделаем.

comment:7 by dimag, 8 years ago

Keywords: Log Encoding added
Resolution: fixed
Status: reopenedclosed

comment:8 by san, 7 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.