2012-11-19 8 views
11

Ich bin auf dem CMD in Windows 8 und ich habe die Codepage auf 65001 (chcp 65001) festgelegt. Ich benutze Python 2.7.2 (ActivePython 2.7.2.5) und habe die Umgebungsvariable PYTHONSTARTUP auf "bootstrap.py" gesetzt.Warum bekomme ich IOErrors beim Schreiben von Unicode in den CMD? (Mit Codepage 65001)

bootstrap.py:

import codecs 
codecs.register(
    lambda name: name == 'cp65001' and codecs.lookup('UTF-8') or None 
) 

Das ist mir Druck ASCII läßt:

>>> print 'hello' 
hello 
>>> print u'hello' 
hello 

Aber die Fehler, die ich bekomme, wenn ich versuche, eine Unicode-Zeichenfolge mit Nicht-ASCII-Zeichen zu drucken, machen keine Sinn für mich. Hier versuche ich ein paar Zeichenketten enthalten Nordic Symbole zu drucken (I hinzugefügt, um die zusätzlichen Zeilenumbruch zwischen den Abzügen für Lesbarkeit):

>>> print u'æøå' 
��øåTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 2] No such file or directory 

>>> print u'åndalsnes' 
��ndalsnes 

>>> print u'åndalsnesæ' 
��ndalsnesæTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

>>> print u'Øst' 
��st 

>>> print u'uØst' 
uØstTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

>>> print u'ØstÆØÅæøå' 
��stÆØÅæøåTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

>>> print u'_ØstÆØÅæøå' 
_ØstÆØÅæøåTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

Wie sehen Sie es nicht immer einen Fehler aus (und nicht einmal erhöhen immer den gleichen Fehler), und die nordischen Symbole werden nur gelegentlich korrekt angezeigt.

Kann jemand dieses Verhalten erklären, oder mir wenigstens helfen, herauszufinden, wie man Unicode richtig auf den CMD druckt?

+2

Dies ist eine Albtraumsituation. Und es wurde unzählige Male hier auf SO und anderswo diskutiert. Zum Beispiel: http://www.google.com/search?q=print+unicode+windows+console+python –

+0

Die einfachste Lösung ist die Verwendung von Python 3.3, wenn Sie können. Es hat einen [cp65001 Codec] (http://docs.python.org/3/whatsnew/3.3.html#codecs). – eryksun

+0

@PiotrDobrogost: Bitte beziehen Sie sich auf einen anderen Fall wie diesen, wenn Sie es finden können (und ** ** ** nicht bedeuten Unicode-Decodierungsfehler!) – Hubro

Antwort

1

Try This:

# -*- coding: utf-8 -*- 
    from __future__ import unicode_literals 
    print u'æøå' 

Die Nutzung von von __future__ Import unicode_literals würde in eine interaktive Python-Sitzung nützlich sein.

Es ist sicherlich möglich, Unicode an die Konsole zu schreiben erfolgreich mit WriteConsoleW. Dies funktioniert unabhängig von der Konsolencodepage, einschließlich 65001. Der Code here tut dies (es ist für Python 2.x, aber Sie würden WriteConsoleW trotzdem von C aufrufen).

WriteConsoleW hat einen Fehler, den ich kenne, nämlich fails when writing more than 26608 characters at once. Das ist einfach zu umgehen, da die Datenmenge in einem einzelnen Anruf begrenzt wird.

Schriften sind nicht Pythons Problem, aber Codierung ist. Es macht keinen Sinn, die richtigen Zeichen nicht auszugeben, nur weil einige Benutzer möglicherweise keine Schriftarten ausgewählt haben, die diese Zeichen anzeigen können. Dieser Fehler sollte erneut geöffnet werden.

(Der Vollständigkeit halber ist es möglich, Unicode auf der Konsole mit anderen Schriftarten als Lucida Console und Consolas anzuzeigen, aber es requires a registry hack.) Ich hoffe, es hilft.

+0

Ich glaube, WriteConsoleW ist auf UCS-2 beschränkt, d. H. Sie können keine Zeichen von den zusätzlichen Ebenen verwenden. In den meisten Fällen sollte dies jedoch kein Problem darstellen. –

Verwandte Themen