Frage zu Unicode

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.
Antworten
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Sonntag 12. August 2007, 18:00

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Sonntag 12. August 2007, 18:17

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 ;)
BlackJack

Sonntag 12. August 2007, 18:21

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()`.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Sonntag 12. August 2007, 18:33

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?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Sonntag 12. August 2007, 18:38

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
BlackJack

Sonntag 12. August 2007, 18:41

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.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Sonntag 12. August 2007, 20:53

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
BlackJack

Sonntag 12. August 2007, 21:29

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.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Montag 13. August 2007, 08:24

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.
BlackJack

Montag 13. August 2007, 09:07

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.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Montag 13. August 2007, 09:41

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!
Antworten