Hallo zusammen,
ich beschäftige mich erst seit wenigen Tagen mit Python und habe deswegen noch wenig Ahnung von der Materie. habt deswegen etwas Nachsicht mit mir.
Ich verwende Python unter Windows XP (32-bit), genauso wie die shell ipython.
Beim Einstieg in die Materie ist mir aufgefallen, dass UTF-8-kodierte scripts weder in der IDLE noch in ipython richtig ausgegeben werden (genauer geasagt die Sonderzeichen, also nicht-ASCII-Elemente). Nach drei Tagen googlen habe ich mittlerweile herausgefunden, dass die jeweiligen shells cp1252-kodiert (IDLE) bzw. cp*irgendwas*-kodiert (ipython) sind. Anscheinend kann man das auch nicht ändern, zumindest habe ich nichts gefunden.
Die Lösung des Problems ist es wohl nun einfach die scripts cp1252-kodiert zu schreiben. In der IDLE funktioniert das auch prächtig, in ipython ist das etwas komplizierter, da in der Eingabeaufforderung in Windows cp850 standardmäßig eingestellt ist. Jedenfalls habe ich es aber letztendlich hingekriegt, ipython auf cp1252 umzustellen.
Da ich nirgendwo im Netz eine gute Erklärung der Problematik gefunden habe, habe ich eine pdf-Datei erstellt, die die von mir gefundene Lösung beschreibt. Man kann sie finden unter http://www.markz.de/windowsencodingproblem.pdf
Da ich ein Anfänger bin, ist das Dokument natürlich für Anfänger gedacht. Für euch sind das wahrscheinlich alles olle Kamellen, aber ich dachte für Anfänger könnte das ganz hilfreich sein.
Über Feedback wäre ich natürlich dankbar, da ich, wie gesagt, wenig Ahnung von dem ganzen habe.
Viele Grüße
Markus
P.S.: Da ich absolut keinen Plan von Linux oder Unix habe: Unter Linux oder Unix werden UTF-8-kodierte scripts "ordnungsgemäß ausgegeben", richtig?
Encoding-Probleme unter Windows (cp1252, utf-8, usw.)
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Du vermengst hier ein paar Sachen, die nichts miteinander zu tun haben.
Die Kodierung der Skripte ist nur fuer den Parser und die Interpretation von String-Literalen wichtig ist.
Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
Allerdings versteh ich nicht, was du mit "nicht richtig ausgegeben" meinst? Bekommst du `UnicodeEncodeErrors` oder was meinst du?
Die Kodierung der Skripte ist nur fuer den Parser und die Interpretation von String-Literalen wichtig ist.
Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
Allerdings versteh ich nicht, was du mit "nicht richtig ausgegeben" meinst? Bekommst du `UnicodeEncodeErrors` oder was meinst du?
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Ja, du hast recht. Vielen Dank.cofi hat geschrieben:Du vermengst hier ein paar Sachen, die nichts miteinander zu tun haben.
Die Kodierung der Skripte ist nur fuer den Parser und die Interpretation von String-Literalen wichtig ist.
Ah. Gerade geht mir ein Licht auf.cofi hat geschrieben:Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
Ich meinte: Wenn ich print "Ö" in ein script schreibe und dann das script ausführe ("run module"), dass dann auch Ö ausgegeben wird, d.h. der parser das Ö richtig interpretiert. Dazu muss ich, wie du gerade eben geschrieben hast, wenn meine shell (z.B. meine IDLE) cp1252-kodiert ist, das script auch cp1252-kodieren (z.B. mit # -*- cp1252 -*-) . Wenn ich das script UTF-8-kodiere (mit # -*- utf-8 -*-) wird Ö mit dem UTF-8 enodiert (\xc3\x96) und die Ausgabe in der cp1252-kodierten shell ist à (für \xc3) und – (für \x96), also Öcofi hat geschrieben:Allerdings versteh ich nicht, was du mit "nicht richtig ausgegeben" meinst? Bekommst du `UnicodeEncodeErrors` oder was meinst du?
Lange Rede, ganz kurzer Sinn: Mit "nicht richtig ausgegeben" meinte ich also einfach, dass die String-Literale nicht passend für die shell vom parser interpretiert werden (eben auf Grund der nicht passenden Encodierung) und mir "falsche" Zeichen ausgeben.
Viele Grüße!
Zuletzt geändert von MarkZ am Montag 9. November 2009, 22:20, insgesamt 1-mal geändert.
@MarkZ: Wobei print das (normalerweise) automatisch macht, wenn Du ihm auch tatsächlich ein Unicode-Objekt übergibst.Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
Richtig wäre es so (Python < Version 3.0):
Code: Alles auswählen
print u"Hallo Österreich"
Tatsächlich! Danke! Damit ist mein ganzes Rumgeeier natürlich hinfällig. Unglaublich, dass die Antwort so einfach ist.fhoech hat geschrieben:@MarkZ: Wobei print das (normalerweise) automatisch macht, wenn Du ihm auch tatsächlich ein Unicode-Objekt übergibst.Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
Richtig wäre es so (Python < Version 3.0):Code: Alles auswählen
print u"Hallo Österreich"
Wow, vielen Dank.