UnicodeDecodeError auf byte-Typ
Mit Python 3.4 ich bekomme die folgende Fehlermeldung, wenn Sie versuchen zu entschlüsseln byte-Typ unter Verwendung von utf-32
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, wenn Sie versuchen, Sie zu entschlüsseln, die in 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
Wenn ich decode utf-8 gibt es keine Fehler. s ist ein socket verbunden twitch-IRC-server irc.chat.twitch.tv auf port 80.
Erhält er 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'
Mache ich etwas falsch, wenn Sie versuchen zu entschlüsseln, um utf-16 und 32? Der Grund, warum ich möchte, um die Verwendung von utf-32 ist, weil gelegentlich jemand sendet ein Zeichen, das nicht im utf-8 und ich möchte in der Lage sein, um erhalten, dass, anstatt es wirft einen Fehler, da utf-8 nicht unterstützt, der Charakter.
Vielen Dank für jede Hilfe.
- verwenden
decode('utf-8', errors='replace')
zum Beispiel. - Ich versuche nicht, den Fehler zu vermeiden alle zusammen, ich bin versucht zu erhalten, die Zeichen, die nicht unterstützt, die in utf-8.
- So können Sie versuchen zu entschlüsseln, die ganze Zeile mit UTF-8. Wenn eine Ausnahme ausgelöst wird, erst dann versuchen Sie einen alternativen Zeichensatz. Ich bezweifle, IRC protocl erlauben würde, UTF-16, 32 immer, weil der embedded-NULs
- "Wenn ich decode utf-8-es gibt keine Fehler". Also, warum Sie denken, UTF-16 oder UTF-32 funktionieren sollte??
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen Sie es mit encoding = 'ISO-8859-1'
latin-1
(der freundliche Bezeichnung für ISO-8859-1) kodiert, nichtutf-8
. Oder es ist es nicht, aberlatin-1
ist eine eins-zu-eins-Codierung, wo jedes byte Karten zu einem Zeichen, es ist also nur Maskierung von Fehlern und Kauderwelsch produzieren. So oder so.Jeder Unicode Ordnungszahl dargestellt werden können, in UTF-8, wenn
decode
ing als UTF-8 nicht funktioniert, das ist, weil die bytes gesendet werden, in einer anderen Codierung, oder die Daten werden sowohl text-und Binär-Daten, und nur einige ist es UTF-8. Verschiedenheit der text ist UTF-8 codiert sein (die meisten Netzwerk-Protokolle), also nicht-UTF-8-Daten-framing-Daten oder ähnliches, und würde müssen analysiert werden, um zu extrahieren die text-Daten.Jeden Versuch, die Maske solcher Fehler im text/binary Fall wäre nur silencing Probleme, nicht Sie zu beheben. Sie müssen wissen, der Codierung der Daten (und das format, wenn es nicht alle text-Daten mit einer einzigen Codierung) und verwenden Sie diese. Die Daten, die Sie erhalten, nicht magisch UTF-16 oder UTF-32, weil Sie es wollen.
können Sie versuchen, mit decode/encode('utf-16-le'). Ich habe es versucht und es war OK für mich. Aber ich bin mir nicht wirklich klar, warum. 😛