Forum: PC-Programmierung Python - Zeichensatz umwandeln?


von Matt B. (mattb)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?


: Bearbeitet durch User
von Matt B. (mattb)


Lesenswert?

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.

von Fred (Gast)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Fred schrieb:
> Kiffst du?

Er könnte UTF16 meinen, so wie es nativ in Windows verwendet wird.

von npn (Gast)


Lesenswert?

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.

von Fred (Gast)


Lesenswert?

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?

von Fred (Gast)


Lesenswert?

npn schrieb:
> Versuchs mal mit "Unicode Transformation Format", passt vielleicht
> besser.

Stimmt auffallend. :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von Fred (Gast)


Lesenswert?

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.

von Jan H. (j_hansen)


Lesenswert?

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).

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
Noch kein Account? Hier anmelden.