Python - Zeichensatz umwandeln?

OP #3691773
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
OP
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.
Gast
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.
Moderator
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.
Gast
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).
Moderator
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 ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.