[Python-de] print von Nicht-ASCII-Zeichen

Alexander 'boesi' Bösecke boesi.josi at gmx.net
Die Aug 29 14:08:47 CEST 2006


Hi

Am 29.08.2006 11:52:56 schrieb Martin Richtarsky:

> "Encoding nicht gesetzt" soll in dem Fall heissen, dass der Default
> verwendet wird. Das ist dann ASCII. Python versucht bei der Ausgabe von
> Unicode-Strings (auch bei write(), wie mir gerade aufgefallen ist)
> immer, die entsprechend zu encoden.

Also letzten Endes ist der Fehler eine Verkettung unglücklicher Umstände?
Weil wenn kein Terminal vorhanden ist, kann kein Encoding bestimmt
werden. Soweit klar... [1] Das heisst aber auch, wenn pythonw.exe
verwendet wird muss man entweder ...
1. auf Nicht-ASCII-Zeichen (bzw Unicode-Strings) verzichten
2. die Strings händisch umgewandeln
3. das Encoding nachträglich setzen

1&2 sind nicht wirklich praktikabel. Und für den Punkt 3 stellt sich mir
die Frage, welches Encoding ich verwende, damit die Software überall
funktioniert. Wenn ich den Link von Jens richtig verstanden hab und das
mit der Methode von Diez kombiniere:

        if sys.stdout.encoding is None:
            import codecs
            fse = sys.getfilesystemencoding()
            sys.stdout = codecs.getwriter(fse)(sys.stdout)
            
... hab ich eine hinreichend portable Lösung oder? Unter portabel
verstehe ich in diesem Fall, dass auf *keinem* System eine Fehlermeldung
kommt und auf möglichst vielen Systemen die Zeichen korrekt dargestellt
werden.
 
> > In beiden Fällen ändert sich bei mir die Ausgabe von
> > locale.getlocale(locale.LC_ALL) von (None, None) auf ['de_DE', '1252'].
> > Sonst ändert sich aber nix...
> 
> Und was sagt sys.stdout.encoding?

Das scheint von locale unabhängig zu sein...
python.exe: CP850
pythonw.exe: None

Seltsamerweise ändert sich daran auch nix, wenn ich das Encoding wie
oben geschrieben, ändere. Bei MinGW kommt dagegen immer None, aber ich
denke das liegt daran, dass GetConsoleOutputCP da nix vernüftiges
liefert, oder?[2] Allerdings bekomme ich mit der Methode oben auch unter
MinGW den richtigen Output (also mit korrekt dargestellten Umlauten).
 
> Die Methode von Diez funktioniert bei mir unter Windows 2000.

Bei mir auch, da war ich etwas voreilig. Ich hatte testweise aus dem
print u'ä' ein print 'ä' gemacht. Das kann natürlich nicht funktionieren,
aber dummerweise hatte ich diese Version auf den W2k-Rechner kopiert.


cu boesi

[1] nicht klar ist mir dagegen, warum encoding=None bedeutet, dass das
default-encoding verwendet wird. Intuitiv würde ich sagen encoding=None,
bedeutet der String wird so ausgegeben wie er ist (also einfach als
Folge von Bytes). Es ist auf jeden Fall ein ganz merkwürdiges Verhalten,
wenn ein print-Befehl nur dann zu einem Absturz führt, wenn der Output
des Befehls nicht sichtbar ist.
[2] ich nutze da auch die normale Windows-Version von Python.
-- 
<seasons82> was ist rl?
<seasons82> und muss man das wissen?
...der moment wo einem klar wird,
          dass man zuviel chattet...



More information about the python-de mailing list