Python UTF-8 не может декодировать байт на 32-битной машине

он отлично работает на 64-битных машинах, но по какой-то причине не будет работать на python 2.4.3 на 32-битном экземпляре.

я получаю ошибку

'utf8' codec can't decode bytes in position 76-79: invalid data 

для кода

 try: str(sourceresult.sourcename).encode('utf8','replace') except: raise Exception( repr(sourceresult.sourcename ) ) 

он возвращает «kazamidori blog \ xf9»

Я изменил файл site.py, чтобы сделать UTF8 кодировкой по умолчанию, но, похоже, не работает.

Нам нужно следующее, и нам нужен точный вывод:

 type(sourceresult.sourcename) # I suspect it's already a UTF-8 encoded string repr(sourceresult.sourcename) 

Как я уже сказал, я почти уверен, что ваше sourceresult.sourcename уже является кодировкой UTF-8.

Возможно, это может немного помочь.

EDIT: кажется, ваш sourceresult.sourcename закодирован как cp1252. Я не знаю, что такое mystring (что вы ссылаетесь в комментарии). Итак, чтобы получить кодированную строку UTF-8, вам нужно сделать следующее:

 source_as_UTF8= sourceresult.sourcename.decode("cp1252").encode("utf-8") 

Однако строка, кодируемая cp1252, не согласуется с сообщением об ошибке, которое вы указали.

«Недопустимые данные» обычно означает, что входящие данные содержат символы вне его набора символов.

Это часто приводит к тому, что в некоторых случаях некоторые данные кодируются в наборе символов, отличном от UTF-8.

Например, если файл, который хранится в строке, не был преобразован в UTF-8, когда вы сделали UTF-8 стандартным набором символов. (В Windows вы обычно можете указать кодировку файла в диалоговом окне «Сохранить как …» вашего текстового редактора)

Или, когда данные поступают из базы данных, которая использует другой набор символов в таблицах, в соединении или в обоих.

Проверьте, откуда взялись данные, и какие кодировки задаются на этом пути.

Я думаю, что проблема заключается в использовании функции str (). Имейте в виду, что str () возвращает узкие, то есть строки с 1 байтом на символ. Если вход, sourceresult.sourcename, является unicode, то Python автоматически кодирует его, чтобы вернуть узкую строку. По умолчанию для этого используется системная кодировка, которая, вероятно, что-то вроде ISO-8859-1.

Таким образом, вы получаете ошибку, потому что не имеет смысла вызывать кодировку на уже закодированной строке. Если вы избавитесь от str (), он должен работать.

Убедитесь, что в поле varchar нет нечетного количества байтов; У меня был варчар (255), который взорвался, когда кто-то вошел в длинную строку на арабском языке. Затем я получил ошибку «неожиданного конца данных» (как и следовало ожидать …!)