2016-03-21 5 views
0

Использование Python 3.4 Я получаю следующее сообщение об ошибке при попытке расшифровать тип байт с использованием UTF-32UnicodeDecodeError по типу байт

Traceback (most recent call last): 
    File "c:.\SharqBot.py", line 1130, in <module> 
    fullR=s.recv(1024).decode('utf-32').split('\r\n') 
UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position 0-3: codepoint not in range(0x110000) 

и следующее при попытке декодировать его в UTF-16

File "c:.\SharqBot.py", line 1128, in <module> 
    fullR=s.recv(1024).decode('utf-16').split('\r\n') 
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x0a in position 374: truncated data 

При декодировании с использованием utf-8 ошибки не возникает. s является сокет подключен к irc.chat.twitch.tv подергивание IRC-сервера на порту 80.

Он получает следующее:

b':tmi.twitch.tv 001 absolutelyabot :Welcome, GLHF!\r\n:tmi.twitch.tv 002 absolutelyabot :Your host is tmi.twitch.tv\r\n:tmi.twitch.tv 003 absolutelyabot :This server is rather new\r\n:tmi.twitch.tv 004 absolutelyabot :-\r\n:tmi.twitch.tv 375 absolutelyabot :-\r\n:tmi.twitch.tv 372 absolutelyabot :You are in a maze of twisty passages, all alike.\r\n:tmi.twitch.tv 376 absolutelyabot :>\r\n' 

я делаю что-то неправильно, когда пытается декодировать в UTF-16 и 32? Причина, по которой я хочу использовать utf-32, заключается в том, что иногда кто-то отправляет символ, который не находится в utf-8, и я хочу, чтобы он мог получить, что вместо него бросает ошибку, потому что utf-8 не поддерживает этот символ. Спасибо за любую помощь.

+0

использовать 'decode ('utf-8', errors = 'replace')' например. –

+0

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

+0

Итак, вы можете попробовать декодировать всю строку, используя UTF-8. Если выбрано исключение, * только тогда попробуйте альтернативную кодировку *. Я сомневаюсь, что IRC protocl позволит UTF-16, 32 * когда-либо *, из-за встроенных NUL –

ответ

1

Каждый Unicode порядковое может быть представлено в UTF-8, если decode Инг, как UTF-8 не работает, то это потому, что байты, передаваемые в другой кодировке, или данные смешанный текст и двоичные данные , и только некоторые из них - UTF-8. Коэффициенты - это текст is кодированный UTF-8 (большинство сетевых протоколов), поэтому данные, не относящиеся к UTF-8, будут представлять собой данные кадрирования или тому подобное, и их необходимо проанализировать для извлечения текстовых данных.

Любая попытка замаскировать такую ​​ошибку в текстовом/двоичном случае будет просто замалчивать проблемы, а не исправлять их. Вам необходимо знать кодировку данных (и формат, если это не все текстовые данные с одной кодировкой), и использовать это. Полученные вами данные не волшебным образом становятся UTF-16 или UTF-32, потому что вы этого хотите.

+0

IRC не указывает кодировку текста. –

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