Почему Python не пишет символы из Latin Extended-A (UnicodeEncodeError при записи в файл)? - PullRequest
2 голосов
/ 07 апреля 2019

Обязательное вступление, отмечающее, что я провел какое-то исследование

Кажется, что это должно быть просто (я рад закрыть как дубликат, если найден подходящий целевой вопрос),но я недостаточно знаком с кодировкой символов и тем, как Python обрабатывает их, чтобы разобраться с этим самостоятельно.Имея риск показаться ленивым, я отмечу, что ответ очень хорошо может быть в одной из ссылок ниже, но я еще не видел его в своем чтении.

Я ссылался на некоторые документы: Unicode HOWTO , codecs.py docs

Я также рассмотрел некоторые старые вопросы SO с большим количеством голосов: Запись текста Unicode в текстовый файл? , Python, Unicode и консоль Windows


Вопрос

Вот пример кода MCVE это демонстрирует мою проблему:

with open('foo.txt', 'wt') as outfile:
    outfile.write('\u014d')

Трассировка выглядит следующим образом:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Users\cashamerica\AppData\Local\Programs\Python\Python3\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u014d' in position 0: character maps to <undefined>

Я запутался, потому что кодовая точка U+014D это '' ', назначенная кодовая точка,LATIN SMALL LETTER O WITH MACRON ( официальный источник Unicode )

Я даже могу вывести символ на консоль Windows (но он отображается как обычный 'o'):

>>> print('\u014d')
o

1 Ответ

4 голосов
/ 07 апреля 2019

Вы используете cp1252 в качестве кодировки по умолчанию, которая не включает ō.

Напишите (и прочитайте) ваш файл с явной кодировкой:

with open('foo.txt', 'wt', encoding='utf8') as outfile:
    outfile.write('\u014d')
...