Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
ist das eigentlich der richtige Weg zu verhindern, dass es bei einem Programm, das in verschiedenen Ländern, auf verschiedenen Plattformen, bei denen verschiedene Zeichensätze verwendet werden laufen soll Probleme mit Umlauten gibt?
In Python3k werden alle Strings unicode sein und es wird einen Bytetypen geben. Womit eigentlich auch klar wird wieso es (unter anderem) derzeit noch nicht so ist
Zum einen lösen Unicode-Zeichenketten die Probleme nicht wirklich, weil man zur Kommunikation mit der "Aussenwelt" dann doch wieder Bytes, also Zeichenketten braucht. Und zum anderen sind Zeichenketten eigentlich eher Byteketten, da können beliebige Bytes drin stehen.
AFAIK wird es in Python 3.x eine Änderung geben, so dass Unicode-Zeichenkettenliterale nicht mehr extra ausgezeichnet werden müssen und dafür dann normale Zeichenketten. Ausserdem soll es einen extra `bytes`-Typen geben. Wohl so ein Mittelding zwischen Zeichenketten und `array.array()`.
Ok, verstehe. Aber mache ich es dann einstweilen richtig mit dem vorangestellten u, dass meine Umlaute auch überall passen, oder macht man das besser anders?
Du brauchst einen "coding"-Kommentar, damit Python weiss wie die u'bäh'-Unicodeliterale dekodieren werden sollen und eventuell musst Du noch explizit kodieren wo die Unicode-Zeichenketten Dein Programm verlassen. In eine Datei kann man die zum Beispiel nicht einfach schreiben. Da bietet sich `codecs.open()` an.
Ok, ich habe den Artikel studiert. Was mir nun noch unklar ist:
Bei mir hat es bisher einwandfrei funktioniert, einfach mit Unicode Strings zu arbeiten, ohne sie wie EnTeQuAk mich darauf hinwies zu encoden bevor ich sie zB an die Konsole schicke.
Warum funktionierte dies und wann könnte dies mal nicht hinhauen? Macht vielleicht Python eh genau das: .encode(sys.getfilesystemencoding()) wenn ich einen Unicode String in der Konsole ausgebe?
Wenn Python herausfinden kann welche Kodierung die Standardausgabe erwartet, dann gibt's kein Problem. Ausschlaggebend ist das `encoding`-Attribut von dem Dateiobjekt:
Das funktioniert aber zum Beispiel nicht mehr, wenn die Ausgabe des Programms in eine Datei umgeleitet wird. `encoding` ist dann `None`. Python rät dann auch nicht, sondern nimmt ASCII an und löst eine Ausnahme aus, falls das nicht klappt.
Ahh, ok. Danke dir!
Also habe ich das richtig verstanden: Solange der String in der Konsole, oder zB in einem wxPython Fenster ausgegeben wird, verwendet Python die richtige Kodierung. Aber sobald ich in eine Datei, oder Datenbank schreibe nimmt Python nicht die Systemweite Kodierung, sondern einfach ASCII?
Entschuldige, dass ich so lästig bin, aber es wäre echt der Hammer, wenn ich da mal voll durchblicken würde.
So in etwa sollte das stimmen, ausser bei Datenbanken. Da hat das Datenbankmodul ja noch ein Wörtchen mitzureden was es mit Unicode-Zeichenketten anstellt. Man kann bei den meisten Datenbanken eine Kodierung für Text einstellen und ein Datenbankmodul kann in dem Fall natürlich diese Einstellung befragen.
Ah, ok, das erklärt warum es immer gepasst hat wenn ich was, ohne es zu encoden in meine mysql Tabelle geschrieben habe.
Ich glaube jetzt verstehe ich das echt ganz gut. Danke für deine Antworten!