Python, UnicodeEncodeError, преобразование unicode в ascii

Во-первых, я довольно новичок в python, так что простите меня за весь материал n00b. Таким образом, логика приложения в Python выглядит следующим образом:

  • Я отправляю и SQL выбираю в базу данных и возвращает массив данных.
  • Мне нужно взять эти данные и использовать их в другом предложении SQL insert.

Теперь проблема заключается в том, что SQL-запрос возвращает строки unicode. Вывод из выбора выглядит примерно так:

(u'Abc', u'Lololo', u'Fjordk\xe6r')

Итак, сначала я пытался преобразовать его в строку, но он терпит неудачу, поскольку третий элемент содержит эту германскую букву ae:

for x in data[0]:
    str_data.append(str(x))

Я получаю: UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe6' в позиции 6: порядковый номер не в диапазоне (128)

Я могу вставить unicode прямо, чтобы вставить также, как TypeError. TypeError: принуждение к Unicode: нужна строка или буфер, обнаружен NoneType

Любые идеи?

Ответ 1

Из моего опыта, Python и Unicode часто являются проблемой.

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

normal_string = unicode_string.encode('utf-8')

И преобразуем нормальную строку в строку Юникода, как это:

unicode_string = normal_string.decode('utf-8')

Ответ 2

Проблема заключается в том, что функция str пытается преобразовать unicode с помощью ascii кодовой страницы, а ascii кодовая страница не имеет сопоставления для u\xe6 (æ - char ссылка здесь).

Поэтому вам нужно преобразовать его в некоторую кодовую страницу, которая поддерживает char. В настоящее время наиболее обычным является utf-8.

>>> x = (u'Abc', u'Lololo', u'Fjordk\xe6r')
>>> print x[2].encode("utf8")
Fjordkær
>>> x[2].encode("utf-8")
'Fjordk\xc3\xa6r'

С другой стороны, вы можете попытаться преобразовать его в cp1252 - западный латинский алфавит, который его поддерживает:

>>> x[2].encode("cp1252")
'Fjordk\xe6r'

Но Eeaster European charset cp1250 не поддерживает его:

>>> x[2].encode("cp1250")
...
UnicodeEncodeError: 'charmap' codec can't encode character u'\xe6' in position 6: character maps to <undefined>

Проблема с unicode в python очень распространена, и я предлагаю следующее:

  • понять, что юникод
  • понять, что такое utf-8 (это не unicode)
  • понимать ascii и другие кодовые страницы
  • рекомендуемый рабочий процесс конверсии: ввод (любой cp) → конвертировать в unicode → (процесс) → вывод в utf-8