2014-12-11 4 views
0

я получаю эту ошибку:exceptions.UnicodeDecodeError - 'ASCII' кодек не может декодировать байт

<type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128) 
     args = ('ascii', '\xe2\x9d\xb6 Senn =)', 0, 1, 'ordinal not in range(128)') 
     encoding = 'ascii' 
     end = 1 
     message = '' 
     object = '\xe2\x9d\xb6 Senn =)' 
     reason = 'ordinal not in range(128)' 
     start = 0 

Используя этот код:

steamFriend = data['response']['players'][i] 
    n = steamUser(steamFriend['personaname'].encode("utf-8"), steamFriend['steamid'], steamFriend['avatarfull'], steamFriend['profileurl'], steamFriend['personastate'], False) 

Некоторые вещи, чтобы отметить:

  • steamFriend - объект JSON
  • Я получаю эту ошибку только иногда, beca использование steamFriend['personaname'] содержит некоторые странные символы (например, ❶), и я не знаю, как правильно разобрать это, поэтому я не получаю ошибок.

Любая помощь с благодарностью. Также \xe2\x9d\xb6 Senn =) должен представлять ❶ Senn =), если это помогает.

+0

Если бы подобную ошибку один раз в моем веб-выскабливание , Разрешение сначала декодировало строку как ascii, затем кодировалось как utf-8. Или, может быть, наоборот ... –

ответ

0

Не видя полного кода, это трудно сказать, но, похоже, что параисполнитель ожидает ввода ascii. Если это проблема, вы можете решить ее:

streamFriend['personaname'].encode("ascii", errors="ignore") 

или

streamFriend['personaname'].encode("ascii", errors="replace") 

Очевидно, что вы потеряете Юникода в процессе.

+0

Я не хочу потерять символы Юникода, так что альтернатива? –

+0

У вас нет альтернативы, если функция steamUser ожидает данные ascii, за исключением, возможно, использования ошибок = «xmlcharrefreplace», которые преобразуют символы Unicode в представление ascii xml. Затем вы можете использовать https://stackoverflow.com/questions/17341601/convert-string-from-xmlcharrefreplace-back-to-utf-8, чтобы преобразовать его обратно в utf8, когда это необходимо. Более простое и чистое решение, если у вас есть контроль над полной базой кода, заключается в том, чтобы исправить функцию steamUser, чтобы он мог принимать unicode. –

1

Если указанная ошибка возникает в строке n=..., подразумевается, что steamFriend['personaname'] является байтовой строкой, а не строкой Unicode.

Следовательно, когда вы просите .encode его, Python должен де кода строки в Unicode для того, чтобы иметь возможность ан коде обратно в байтах. Неявное декодирование происходит с использованием кодировки по умолчанию, которая является ASCII, поэтому, поскольку строка байтов не содержит только ASCII, вы получаете сбой.

Вы уверены, что не хотел делать:

steamFriend['personaname'].decode("utf-8") 

де кодирования байт строки '\xe2\x9d\xb6 Senn =)' с использованием UTF-8 даст вам строку Unicode u'\u2776 Senn =)', где U + 2776 = ❶ так, что будет больше похоже на то, что вам нужно.

(Обычно, однако, JSON строки явно Unicode, так что не ясно, где вы бы получили байт строки из. Как вы загрузки содержимого JSON?)

+0

Итак, если я его декодирую, то получаю эту ошибку ': кодек' ascii 'не может кодировать символ u' \ u2776 'в позиции 2954: порядковый номер не в диапазоне (128) '. Что мне теперь делать? Должен ли я кодировать обратно в ascii, чтобы получить ❶? –

+0

Я вынул '.encode (" utf-8 ")' часть, потому что вы правы - строка JSON уже юникод - она ​​имеет значение 'u '\ u2776 Senn =)'' –

Смежные вопросы