UnicodeEncodeError при записи в файл - PullRequest
16 голосов
/ 04 августа 2011

Я пытаюсь записать некоторые строки в файл (строки были переданы мне парсером HTML BeautifulSoup).

Я могу использовать «print» для их отображения, но когда я использую file.write (), я получаю следующую ошибку:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128)

Как я могу разобрать это?

Ответы [ 3 ]

18 голосов
/ 04 августа 2011

Да, примерно 99,9% опытных пользователей Python видели его раньше.

Если я наберу 'Python Unicode' в Google, я получу около 14 миллионов результатов; первый http://docs.python.org/howto/unicode.html официальный документ, который описывает всю ситуацию в мучительных деталях; и четвертый - http://farmdev.com/talks/unicode/, который представляет собой более практический обзор, который в значительной степени даст вам ответ, а также убедится, что вы понимаете, что происходит.

Вам действительно нужно читать и понимать подобные обзоры, какими бы длинными они ни казались. Там действительно нет никакого обхода. Текст сложный. Не существует такого понятия, как «простой текст», не было разумного факсимильного сообщения в течение многих лет, и его никогда не было, хотя мы потратили десятилетия, притворяясь, что это было. Но Юникод, по крайней мере, стандарт.

Вы также должны прочитать http://www.joelonsoftware.com/articles/Unicode.html.

13 голосов
/ 04 августа 2011

Эта ошибка возникает, когда вы передаете строку Unicode, содержащую неанглийские символы (символы Unicode за 128), к чему-то, ожидающему строку ASCII.Кодировка по умолчанию для строки байтов Python - ASCII, «которая обрабатывает ровно 128 (английских) символов».Вот почему попытка преобразовать символы Unicode за 128 приводит к ошибке.

Конструктор unicode ()

unicode(string[, encoding, errors])

имеет подпись unicode (строка [, кодирование, ошибки]).Все его аргументы должны быть 8-битными строками.

Первый аргумент преобразуется в Unicode с использованием указанной кодировки; если вы не укажете аргумент кодирования, для преобразования будет использоваться кодировка ASCII , поэтому символы больше 127 будут обрабатываться как ошибки

, например

s = u'La Pe\xf1a' 
print s.encode('latin-1')

или

write(s.encode('latin-1'))

будет кодироваться с использованием латинского-1

3 голосов
/ 04 августа 2011

Ответ на ваш вопрос «используйте кодеки». Добавленный код также показывает магию gettext, FWIW. http://wiki.wxpython.org/Internationalization

import codecs

import gettext

localedir = './locale'
langid = wx.LANGUAGE_DEFAULT # use OS default; or use LANGUAGE_JAPANESE, etc.
domain = "MyApp"             
mylocale = wx.Locale(langid)
mylocale.AddCatalogLookupPathPrefix(localedir)
mylocale.AddCatalog(domain)

translater = gettext.translation(domain, localedir, 
                                 [mylocale.GetCanonicalName()], fallback = True)
translater.install(unicode = True)

# translater.install() installs the gettext _() translater function into our namespace...

msg = _("A message that gettext will translate, probably putting Unicode in here")

# use codecs.open() to convert Unicode strings to UTF8

Logfile = codecs.open(logfile_name, 'w', encoding='utf-8')

Logfile.write(msg + '\n')

Несмотря на то, что Google был полон хитов по этой проблеме, мне было довольно сложно найти это простое решение (на самом деле оно есть в документации Python о Unicode, но скорее похоронено).

Итак ... HTH ...

гай

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...