Я пытаюсь записать кодированную строку UTF-8 в файл, используя пакет протоколирования Python. В качестве примера игрушки:
import logging
def logging_test():
handler = logging.FileHandler("/home/ted/logfile.txt", "w",
encoding = "UTF-8")
formatter = logging.Formatter("%(message)s")
handler.setFormatter(formatter)
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.INFO)
# This is an o with a hat on it.
byte_string = '\xc3\xb4'
unicode_string = unicode("\xc3\xb4", "utf-8")
print "printed unicode object: %s" % unicode_string
# Explode
root_logger.info(unicode_string)
if __name__ == "__main__":
logging_test()
Это взрывается с помощью UnicodeDecodeError при вызове logging.info().
На более низком уровне пакет протоколов Python использует пакет кодеков для открытия файла журнала, передавая в качестве аргумента аргумент "UTF-8". Это хорошо и хорошо, но он пытается записать строки байтов в файл вместо объектов unicode, которые взрываются. По сути, Python делает это:
file_handler.write(unicode_string.encode("UTF-8"))
Когда это должно быть сделано:
file_handler.write(unicode_string)
Является ли это ошибкой в Python, или я беру сумасшедшие таблетки? FWIW, это запасная установка Python 2.6.