zettberlin schrieb:
Ahhh – jetzt klärt sich der Nebel! Intern arbeitet Python also immer nur mit ASCII (oder Integer etc) und Unicode-Extras wie Umlaute oder Kyrillisch werden nur nach Außen für Menschlein bei Bedarf dargestellt – richtig?
Nein! Wenn wir bei Python2 bleiben, arbeitet Python intern entweder mit Bytestrings oder mit Unicodestrings. Sobald irgend etwas auf irgend einem Medium ausgegeben wird (Shell, Datei), muss der rein im Speicher dargestellte Unicode in einen Bytestring gewandelt werden. Ein Bytestring hat immer eine bestimmte Codierung, also ASCII, iso-8859-x, utf-8, latin-1 usw. Je nach Encoding kann man also spezielle Zeichen wie Umlaute darstellen. utf-8 ist ein Encoding, welches alle Unicode-Code-Points darstellen kann. Insofern ist utf-8 das ideale Format, wenn man keine Probleme mit De- bzw. Encoding-Fehlern haben möchte.
Sinnvoll ist es in Python2 daher, so früh wie möglich aus einem Bytestring in einen Unicodestring zu decodieren, d.h. sobald man Daten aus einer externen Quelle bekommt (Datei, Usereingabe, Pipe, usw.) und möglichst spät in ein spezielles Encoding zu wandeln, d.h. sobald man Strings wieder speichern / ausgeben will.
Genau das habe ich Dir schon oben geraten.
Die repr
Funktion stellt lediglich lesbare Escape-Sequenzen dar und garantiert damit, dass die Ausgabe sich immer im ASCII Bereich befindet. Dieser ist quasi der kleinste gemeinsame Nenner alles Codecs und daher auf jeder Maschine darstellbar. Insofern bringt Dir das wenig, wenn zwei Encodings vermischt werden (Quellcode liegt utf-8 vor und Eingabe erfolgt per iso-8859). Denn dann kracht es einfach.
Noch etwas zum generellen Verständnis:
Als letztes noch etwas fundamentales:
Unicode != utf-8
Das habe ich selber lange Zeit verwechselt. Also: Bytestrings sind immer in einem bestimmten Format (eben auch utf-8), Unicodestrings sind das universelle, aber nur interne Format, in dem alle Zeichen dieser Welt abbildbar sind. Kann mein Encoding alle Unicode-Zeichen darstellen (wie utf-8), dann habe ich beim encodieren
keine Probleme. Beim decodieren
habe ich logischer Weise keine, da Unicode eben alles beinhaltet.
Aber: Ich muss das Encoding für das korrekte Dekodieren wissen. Man kann zwar raten, aber das muss nicht klappen. Alleine aus Bytestrings kann man das Encoding nicht erkennen!