Seite 1 von 1

Frage zu Unicode

Verfasst: Sonntag 12. August 2007, 18:00
von Stolzi
Hallo,

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?

Code: Alles auswählen

print u'Wirklich alles markierte löschen?'
Wenn es der richtige Weg ist: Dann verstehe ich nicht, warum Python nicht automatisch alle Strings als Unicode nimmt, also zB auch:

Code: Alles auswählen

print 'Wirklich alles markierte löschen?'
Weiss da wer genaueres?

Danke
Stolzi

Verfasst: Sonntag 12. August 2007, 18:17
von veers
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 ;)

Verfasst: Sonntag 12. August 2007, 18:21
von BlackJack
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()`.

Verfasst: Sonntag 12. August 2007, 18:33
von Stolzi
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?

Verfasst: Sonntag 12. August 2007, 18:38
von EnTeQuAk
Dann währe wohl eher

Code: Alles auswählen

print u"mein töööxt".encode(sys.getfilesystemencoding())
Die bessere Wahl.

Wobei man dort wohl sich eher den gesamten Text aus dem Wiki [wiki]Von Umlauten, Unicode und Encodings[/wiki] anschauen sollte.


MfG EnTeQuAk

Verfasst: Sonntag 12. August 2007, 18:41
von BlackJack
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.

Verfasst: Sonntag 12. August 2007, 20:53
von Stolzi
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?

Danke
Stolzi

Verfasst: Sonntag 12. August 2007, 21:29
von BlackJack
Wenn Python herausfinden kann welche Kodierung die Standardausgabe erwartet, dann gibt's kein Problem. Ausschlaggebend ist das `encoding`-Attribut von dem Dateiobjekt:

Code: Alles auswählen

In [70]: sys.stdout.encoding
Out[70]: 'UTF-8'
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.

Verfasst: Montag 13. August 2007, 08:24
von Stolzi
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.

Danke für deine Hilfe.

Verfasst: Montag 13. August 2007, 09:07
von BlackJack
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.

Verfasst: Montag 13. August 2007, 09:41
von Stolzi
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!