UnicodeEncodeError при записи в файл
Я пытаюсь написать некоторые строки в файл (строки были переданы мне парсером HTML BeautifulSoup).
Я могу использовать "print" для их отображения, но когда я использую file.write(), я получаю следующую ошибку:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128)
Как я могу разобрать это?
Ответы
Ответ 1
Эта ошибка возникает, когда вы передаете строку Unicode, содержащую неанглийские символы (символы Unicode за пределами 128), к чему-то, что ожидает ASCII-байта. Кодировка по умолчанию для Python bytestring - ASCII, "которая обрабатывает ровно 128 (английских) символов". Вот почему попытка конвертировать символы Unicode за пределы 128 приводит к ошибке.
Юникод()
unicode(string[, encoding, errors])
Конструктор имеет юникод подписи (строка [, кодировка, ошибки]). Все его аргументы должны быть 8-битными.
Первый аргумент преобразуется в Unicode с использованием указанной кодировки; , если вы не учитываете аргумент кодирования, для преобразования используется кодировка ASCII, поэтому символы более 127 будут считаться ошибками
например
s = u'La Pe\xf1a'
print s.encode('latin-1')
или
write(s.encode('latin-1'))
будет кодировать с использованием latin-1
Ответ 2
Да, примерно 99,9% пользователей-ветеранов Python видели это раньше.
Если я нахожу "python unicode" в Google, я получаю около 14 миллионов результатов; первый http://docs.python.org/howto/unicode.html официальный документ, который описывает всю ситуацию в мучительных подробностях; а четвертый - http://farmdev.com/talks/unicode/, который является более практичным обзором, который в значительной степени даст вам ответ, а также убедитесь, что вы понимаете, что происходит.
Вам действительно нужно прочитать и понять эти виды обзоров, как бы долго они ни казались. Там действительно не обойтись. Текст сложный. Нет такой вещи, как "простой текст", в течение многих лет не было разумного факсимиле, и этого никогда не было, хотя мы проводили десятилетия, делая вид, что есть. Но Unicode по крайней мере стандарт.
Вам также следует прочитать http://www.joelonsoftware.com/articles/Unicode.html.
Ответ 3
Ответ на ваш вопрос - "использование кодеков". Приложенный код также показывает некоторую магию 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...
GAJ