Должен ли я добавить encoding = 'utf-8' в мой обработчик регистрации Python?

Предположим, что я хотел бы обрабатывать строки Unicode при регистрации с помощью Python 2.7. Кажется «правильным» добавить параметр кодирования в FileHandler.

# coding=utf-8 import logging logger = logging.getLogger() logger.addHandler(logging.FileHandler('my_log.txt', encoding='utf-8')) logger.error(u'Pão') logger.error('São') 

У этого есть несколько проблем, хотя:

  1. Он вызывает UnicodeDecodeError в строчном литерале UTF-8 'São'.
  2. Выходной файл имеет окончание строк LF в Windows, когда CRLF представляется более подходящим.

Однако, если я вообще не кодирую какую-либо кодировку, у меня нет ни одной из этих проблем. Обе строки записываются в файл UTF-8, и я получаю концы строк CRLF. (Я думаю, что проблема с окончанием строки связана с открытием файла в двоичном режиме, когда указана кодировка.)

Поскольку опускание кодировки, похоже, работает лучше, есть ли какая-то причина, по которой я отсутствую, что когда-либо буду проходить в encoding='utf-8' ?

One Solution collect form web for “Должен ли я добавить encoding = 'utf-8' в мой обработчик регистрации Python?”

Если вы передаете кодировку в FileHandler , она использует codecs.open() с этой кодировкой, чтобы открыть файл; в противном случае он использует plain open() . Для этого используется encoding .

Помните, что Python 2.x не идеален при правильном обращении с байтами и в Юникоде: есть неявное кодирование и декодирование, которое происходит в разное время, что может вас загнать. Вы действительно не должны передавать строку, как «São», как байты в большинстве случаев: если это текст, вы должны работать с объектами Unicode.

Что касается окончаний строки – это обычно переводится на конечные концы строк для платформы Python для файлов. Но если используется codecs.open() , то основной файл открывается в двоичном режиме, поэтому не происходит codecs.open() \n на \r\n , как это обычно бывает в Windows.

  • Зачем объявлять unicode по строке в python?
  • Как я могу фильтровать символы Emoji из моего ввода, поэтому я могу сохранить в MySQL <5.5?
  • Разделите модификаторы символов Unicode
  • Загрузка файла UTF-8 в Python 3 с помощью numpy.genfromtxt
  • Ошибка MySQL «неправильное строковое значение» при сохранении строки unicode в Django
  • Pandas: сохранить для исключения кодировки
  • Преобразование октетов UTF-8 в юникодные коды
  • Python utf-8, как выровнять печать
  • Python - лучший язык программирования в мире.