2016-03-21 9 views
0

Verwendung von Python 3.4 ich die folgende Fehlermeldung erhalten, wenn ein Byte-Typ mit utf-32UnicodeDecodeError auf Byte-Typ

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) 

und die folgenden zu entschlüsseln versuchen, wenn es in utf-16 zu entschlüsseln versucht

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 

Wenn ich mit utf-8 entschlüsseln gibt es keinen Fehler. s ist eine Buchse mit dem Zucken IRC-Server irc.chat.twitch.tv verbunden auf Port 80.

Er erhält die folgenden:

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' 

Bin ich etwas falsch zu machen, wenn sie versuchen zu utf 16 zu dekodieren und 32? Der Grund, warum ich utf-32 benutzen möchte, ist, dass gelegentlich jemand ein Zeichen sendet, das nicht in utf-8 ist und ich das empfangen möchte, anstatt einen Fehler zu erzeugen, weil utf-8 dieses Zeichen nicht unterstützt. Danke für jede Hilfe.

+0

Verwenden Sie 'decode ('utf-8', errors = 'replace')' zum Beispiel. –

+0

Ich versuche nicht, den Fehler alle zusammen zu vermeiden, ich versuche, die Zeichen zu erhalten, die in utf-8 nicht unterstützt werden. –

+0

So können Sie versuchen, die ganze Zeile mit UTF-8 zu dekodieren. Wenn eine Ausnahme ausgelöst wird, * versuche nur einen alternativen Zeichensatz *. Ich bezweifle, IRC-Protokoll würde UTF-16, 32 * je * erlauben, wegen der eingebetteten NULs –

Antwort

1

Jedes Unicode ordinal kann in UTF-8, wenn decode ing als UTF-8 dargestellt werden, funktioniert nicht, das ist, weil das Bytes in einer anderen Kodierung ist übertragen zu werden, oder die Daten Text und Binärdaten und nur ein Teil davon ist UTF-8. Odds sind der Text ist UTF-8 codiert (die meisten Netzwerkprotokolle sind), so dass nicht-UTF-8-Daten Framing Daten oder dergleichen wären, und müsste analysiert werden, um die Textdaten zu extrahieren.

Jeder Versuch, einen solchen Fehler im Text/Binär-Fall zu maskieren, würde Probleme einfach stummschalten und nicht beheben. Sie müssen die Codierung der Daten (und das Format, wenn nicht alle Textdaten mit einer einzigen Kodierung vorliegen) kennen und diese verwenden. Die Daten, die Sie erhalten, werden nicht zu UTF-16 oder UTF-32, weil Sie es wollen.

+0

IRC keine Textcodierung angeben. –

Verwandte Themen