Подтвердить что ты не робот

Обрабатывать неправильно закодированный символ в строке юникода Python

Я имею дело с строками unicode, возвращаемыми библиотекой python-lastfm.

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

Например, исходная строка, которую я ожидаю в переменной a, является "Glück"

>>> a
u'Gl\xfcck'
>>> print a
Traceback (most recent call last):
  File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)

\ xfc - это экранированное значение 252, которое соответствует латинскому кодированию "ü". Как-то это встраивается в строку unicode таким образом, что python не может работать сам по себе.

Как мне преобразовать эту строку в нормальную или юникодную строку, содержащую оригинальный "Glück"? Я пытался играть с методами декодирования/кодирования, но либо получил UnicodeEncodeError, либо строку, содержащую последовательность\xfc.

4b9b3361

Ответ 1

Строка вашего юникода в порядке:

>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'

Проблема, которую вы видите в интерактивном приглашении, заключается в том, что интерпретатор не знает, какую кодировку использовать для вывода строки на ваш терминал, поэтому он возвращается к кодеку "ascii", но этот кодек знает, как иметь дело с символами ASCII. Он отлично работает на моей машине (потому что sys.stdout.encoding - это "UTF-8" для меня - скорее всего, потому что что-то вроде настроек переменной среды отличается от вашего)

>>> print u'Gl\xfcck'
Glück

Ответ 2

Вам нужно преобразовать строку юникода в стандартную строку, используя некоторую кодировку, например. UTF-8:

some_unicode_string.encode('utf-8')

Кроме того: это обман

BeautifulSoup findall с ошибкой атрибута class-unicode

и по меньшей мере десять других связанных вопросов по SO. Сначала исследования.

Ответ 3

В начале вашего кода, сразу после импорта, добавьте эти 3 строки.

import sys  # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')

Он будет переопределять системное кодирование по умолчанию (ascii) для курса вашей программы.

Изменить: вы не должны этого делать, если не уверены в последствиях, см. комментарий ниже. Этот пост также полезен: Опасности sys.setdefaultencoding('utf-8')

Ответ 4

Не выполняйте str(), чтобы выровнять то, что у вас есть, от полей модели, если оно уже является строкой unicode. (oops, я полностью пропустил, что это не связано с django)