Преобразование в безопасный Unicode в Python - PullRequest
2 голосов
/ 17 мая 2009

Я имею дело с неизвестными данными и пытаюсь вставить в базу данных MySQL, используя Python / Django. Я получаю некоторые ошибки, которые я не совсем понимаю, и ищу какую-то помощь. Вот ошибка.

Incorrect string value: '\xEF\xBF\xBDs m...'

Я предполагаю, что строка неправильно конвертируется в юникод? Вот мой код для преобразования юникода.

s = unicode(content, "utf-8", errors="replace")

Без вышеуказанного преобразования в юникод я получаю ошибку

'utf8' codec can't decode byte 0x92 in position 31: unexpected code byte. You passed in 'Fabulous home on one of Decatur\x92s most

Любая помощь приветствуется!

Ответы [ 3 ]

5 голосов
/ 17 мая 2009

Что такое оригинальная кодировка? Я предполагаю "cp1252" из ответа pixelbeat's . В этом случае вы можете сделать

>>> orig # Byte string, encoded in cp1252
'Fabulous home on one of Decatur\x92s most' 

>>> uni = orig.decode('cp1252')
>>> uni # Unicode string
u'Fabulous home on one of Decatur\u2019s most'

>>> s = uni.encode('utf8')  
>>> s # Correct byte string encoded in utf-8
'Fabulous home on one of Decatur\xe2\x80\x99s most'
3 голосов
/ 17 мая 2009

0x92 - правильная одиночная фигурная кавычка в кодировке windows cp1252.

\ xEF \ xBF \ xBD - кодировка UTF8 заменяющего символа в кодировке UTF8 (который был вставлен вместо ошибочного символа cp1252).

Похоже, ваша база данных не принимает действительные данные UTF8?

2 варианта: 1. Возможно, вам следует использовать Unicode (контент, "cp1252") 2. Если вы хотите вставить UTF-8 в БД, вам необходимо настроить его соответствующим образом. Я оставлю этот ответ другим, более осведомленным

1 голос
/ 17 мая 2009

Строка "Fabulous ..." не похожа на utf-8: 0x92 больше 128 и поэтому должна быть продолжением многобайтового символа. Тем не менее, в этой строке он появляется сам по себе (очевидно, представляя апостроф).

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