Python UTF-8 не может декодировать байт на 32-битной машине - PullRequest
4 голосов
/ 01 апреля 2010

отлично работает на 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 ) )

возвращает 'Блог Казамидори \ xf9'

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

Ответы [ 4 ]

7 голосов
/ 01 апреля 2010

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

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

repr(sourceresult.sourcename)

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

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

РЕДАКТИРОВАТЬ: кажется, ваш sourceresult.sourcename закодирован как cp1252. Я не знаю, что такое mystring (на который вы ссылаетесь в комментарии). Итак, чтобы получить строку в кодировке UTF-8, вам нужно сделать:

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

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

0 голосов
/ 04 января 2011

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

0 голосов
/ 01 апреля 2010

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

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

0 голосов
/ 01 апреля 2010

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

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

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

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

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

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