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