Encoding-Probleme unter Windows (cp1252, utf-8, usw.)

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
MarkZ
User
Beiträge: 3
Registriert: Montag 9. November 2009, 19:47
Wohnort: Berlin
Kontaktdaten:

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?
Benutzeravatar
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?
MarkZ
User
Beiträge: 3
Registriert: Montag 9. November 2009, 19:47
Wohnort: Berlin
Kontaktdaten:

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.
Ja, du hast recht. Vielen Dank.
cofi hat geschrieben:Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
Ah. Gerade geht mir ein Licht auf.
cofi hat geschrieben:Allerdings versteh ich nicht, was du mit "nicht richtig ausgegeben" meinst? Bekommst du `UnicodeEncodeErrors` oder was meinst du?
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 Ö
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.
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
@MarkZ: Wobei print das (normalerweise) automatisch macht, wenn Du ihm auch tatsächlich ein Unicode-Objekt übergibst.
Richtig wäre es so (Python < Version 3.0):

Code: Alles auswählen

print u"Hallo Österreich"
MarkZ
User
Beiträge: 3
Registriert: Montag 9. November 2009, 19:47
Wohnort: Berlin
Kontaktdaten:

fhoech hat geschrieben:
Fuer die Ausgabe ist wichtig, dass du `unicode`-Objekte passend fuer die Shell encodierst.
@MarkZ: Wobei print das (normalerweise) automatisch macht, wenn Du ihm auch tatsächlich ein Unicode-Objekt übergibst.
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.
Wow, vielen Dank.
Antworten