Hallo, ich habe eine Software, die auf einem Windows-Rechner einen TCP-Server bereitstellt. Dieser sendet bei gewissen Events einen String mit Daten an alle verbundenen Clients. Dafür programmiere ich in Python einen Client. Das Problem das ich dabei habe ist, dass die Strings, die der TCP-Server versendet im ANSI-Zeichensatz codiert sind. In Python arbeite ich aber mit UTF-8. Kann mir jemand sagen, wie ich beim Client den empfangenen ANSI-String in UTF-8 umwandeln kann? Danke matt
http://stackoverflow.com/questions/6539881/python-converting-from-iso-8859-1-latin1-to-utf-8 ("ANSI" ist ausreichend identisch mit ISO8859-1)
:
Bearbeitet durch User
Hallo Rufus, nach langem herumprobieren habe ich es jetzt hinbekommen. Allerdings arbeite ich jetzt anstelle von UTF-8 mit Unicode. Für alle die ein ähnliches Problem haben hier der Code zur Umwandlung in Unicode:
1 | unicode_string = encoded_string.decode('iso8859_1') |
Danke für deinen Tipp.
Matt B. schrieb: > anstelle von UTF-8 mit Unicode Kiffst du? UTF steht für "Unicode Transfer Encoding". Da ist also kein "anstelle". Und reines Unicode, so ganz ohne Transfer-Encoding? Reine Ganzzahlen? Ich zweifle...
Fred schrieb: > UTF steht für "Unicode Transfer Encoding". Aha, jetzt weiß ich, daß das "F" in UTF für "Encoding" steht. :-) Versuchs mal mit "Unicode Transformation Format", passt vielleicht besser. Soviel zum Thema > Kiffst du? > Aber nichtsdestotrotz, in der eigentlichen Sache hast du natürlich recht.
Rufus Τ. Firefly schrieb: > Er könnte UTF16 meinen, so wie es nativ in Windows verwendet wird. Und das ändert was genau? Welche UTF-Variante hat deiner Meinung nach nichts mit Unicode zu tun?
npn schrieb: > Versuchs mal mit "Unicode Transformation Format", passt vielleicht > besser. Stimmt auffallend. :-)
Fred schrieb: > Und das ändert was genau? Welche UTF-Variante hat deiner Meinung nach > nichts mit Unicode zu tun? Keine; habe ich das je behauptet?
Fred schrieb: > Matt B. schrieb: >> anstelle von UTF-8 mit Unicode > > Kiffst du? Wie kommst du darauf? > UTF steht für "Unicode Transfer Encoding". Nein, aber das hat ja npn weiter oben bereits korrigiert. > Da ist also kein "anstelle". Auch wenn ein gewisser Zusammenhang zwischen Unicode und UTF-8 besteht, sind die beiden noch lange nicht dasselbe. > Und reines Unicode, so ganz ohne Transfer-Encoding? Reine Ganzzahlen? > Ich zweifle... Zweifle nicht, sondern blicke den Tatsachen ins Auge: Gerade Python (Python 3 noch etwas mehr als Python 2) unterscheidet sehr genau zwischen Unicodestrings und Bytefolgen, die einen String in einer spezifischen Zeichencodierung repräsentieren:
1 | Stringtypen: |
2 | |
3 | Unicodestring Bytefolge |
4 | —————————————————————————————————————————————— |
5 | Python 2 unicode str |
6 | |
7 | Python 3 str bytes |
8 | —————————————————————————————————————————————— |
1 | Stringliterale: |
2 | |
3 | Unicodestring Bytefolge |
4 | —————————————————————————————————————————————— |
5 | Python 2 u'abc' 'abc' oder b'abc' |
6 | |
7 | Python 3 'abc' oder u'abc' b'abc' |
8 | —————————————————————————————————————————————— |
Mit folgender Codezeile
1 | unicode_string = encoded_string.decode('iso8859_1') |
decodiert Matt also tatsächlich eine iso8859-1-Bytefolge in einen Unicodestring und konvertiert sie nicht etwa in eine UTF-8-Bytefolge. Um eine UTF-8-Bytefolge zu erhalten, müsste der Unicodestring erneut encodiert werden:
1 | encoded_string = unicode_string.encode('utf-8') |
Wie du siehst, ist Matts Formulierung
> Allerdings arbeite ich jetzt anstelle von UTF-8 mit Unicode.
nicht die Folge der Einnahme von bewusstseinserweiternder Substanzen,
sondern vollkommen korrekt.
:
Bearbeitet durch Moderator
Yalu X. schrieb: > Mit folgender Codezeile > unicode_string = encoded_string.decode('iso8859_1') > > decodiert Matt also tatsächlich eine iso8859-1-Bytefolge in einen > Unicodestring und konvertiert sie nicht etwa in eine UTF-8-Bytefolge. Blödsinn! bytes.decode(encoding="utf-8", errors="strict") bytearray.decode(encoding="utf-8", errors="strict") Return a string decoded from the given bytes. Default encoding is 'utf-8'. errors may be given to set a different error handling scheme. The default for errors is 'strict', meaning that encoding errors raise a UnicodeError. Other possible values are 'ignore', 'replace' and any other name registered via codecs.register_error(), see section Codec Base Classes. For a list of possible encodings, see section Standard Encodings.
Fred schrieb: > Yalu X. schrieb: >> decodiert Matt also tatsächlich eine iso8859-1-Bytefolge in einen >> Unicodestring und konvertiert sie nicht etwa in eine UTF-8-Bytefolge. > > Blödsinn! > > bytes.decode(encoding="utf-8", errors="strict") > bytearray.decode(encoding="utf-8", errors="strict") > > Return a string decoded from the given bytes. Kannst du das "Blödsinn!" etwas ausführen. In der von dir geposteten Doku steht das doch ebenfalls so (Bytes --> String).
Fred schrieb: > bytes.decode(encoding="utf-8", errors="strict") > bytearray.decode(encoding="utf-8", errors="strict") > > Return a string decoded from the given bytes. Default encoding is > 'utf-8'. errors may be given to set a different error handling scheme. > ... Und was möchtest du jetzt damit ausdrücken? Edit: Jan hat's sogar noch schneller nicht kapiert, was du uns da erzählen möchtest ;-)
:
Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.