Python Unicode/UTF-8 in Python 2 und 3

FAN4TIC

Lt. Commander
Registriert
Nov. 2007
Beiträge
1.738
Hallo zusammen.

ich stehe gerad so ein bisschen auf dem Schlauch und bräuchte mal eine nette Erklärung bezüglich Unicode und Encodings in Python 2 und Python 3.

Folgendes Szenario:
Ich habe einen MySQL Dump eingespielt. Es gibt eine Tabelle mit Inhalten. Encoded ist das Ganze mit utf8mb4_general_ci
Der Inhalt der Tabelle ist ein deutscher Text, der mit Python 2 verarbeitet und eingefügt wurde. Das geschah von einer fremden Person (kein Einblick in Code möglich)

Ich wollte mit diesem Dump arbeiten, in Python 3. Zunächst reicht mir die einfache Ausgabe. Später soll das Text sprachlich analysiert werden.
Folgendes passiert nun, wenn ich auf die Datenbank (in beiden Fällen mit MYSQLdb und denselben Parametern) zugreife und die Zeile auslese.

Linux Terminal Output
(Terminal Charset ist in beiden Fällen gleich, DE_UTF-8)

# -*- coding: utf-8 -*- import sys reload(sys) (sys.setdefaultencoding('utf-8') # -*- coding: utf-8 -*-
Python 2Python 3
print text
"da warst Du ja fleißig"
print (text)
"da warst Du ja fleiÃig"
text
da warst Du ja flei\xc3\x9fig
type= <str>
text
da warst Du ja fleiÃ\x9fig
type= <str>
encode() bringt nix, ist ja schon <str>
text.encode('utf-8')
"da warst Du ja flei\xc3\x83\xc2\x9fig "
type = <bytes>
text.decode('utf-8')
"da warst Du ja flei\xdfig"
typ = <unicode>
decode() geht nicht, weil <str>




Auszug aus der Datenbank mit DataGrip:
"da warst Du ja fleißig"

Nun bin ich gerade zu doof um zu verstehen, wie mein Text in Python 3 zu fixen ist bzw. wie ich ihn schön printen könnte.
Ich weiß ein wenig, wie encoding in Python 3 funktioniert. <str> ist das, "intern" benutzt wird und str kann unicode. bytes ist eine "byte" repräsentation von str, deshalb auch die Escape-Symbole für alles was nicht ASCII ist.
Normalerweise arbeitet man (falls Daten gelesen/ beschrieben werden)
decode > (arbeiten mit str) > encode


Da ich relativ wenig mit Python 2 zutun hatte, kenne ich da die internen Mechaniken nicht. Nach meinem Wissen ist <unicode> das quasi-Äquivalent zu <str> in Python3. Beginnt mit u vorne. u'blablä'

  • die Pyton2-Unicode und Python3-Str Repräsentation unterscheiden sich ja, obwohl beide unicode können sollten. Woran liegt das?
  • Wieso ist der Py2 Print "korrekt" während der Py3 Print noch nicht richtig ist.
  • Wie krieg ich das ganze eigentlich sauber in Python 3 gelesen?

Danke :)
 
Python3.6

Code:
>>> s = 'ß'

>>> s
'ß'

>>> s.encode()
b'\xc3\x9f'

>>> s.encode('utf-8')
b'\xc3\x9f'

>>> s.encode('windows-1252')
b'\xdf'

>>> s.encode('windows-1252').decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdf in position 0: unexpected end of data

>>> s.encode('windows-1252').decode('windows-1252')
'ß'

>>> s.encode('utf-8').decode('windows-1252')
'ß'

>>> s.encode('utf-8').decode('utf-8')
'ß'
 
Zurück
Oben