Update: Python 3.6 implementiert PEP 528: Ändern der Windows-Konsolencodierung in UTF-8 : Die Standardkonsole unter Windows akzeptiert jetzt alle Unicode-Zeichen. Intern verwendet es dieselbe Unicode-API wie das win-unicode-consoleunten erwähnte Paket . print(unicode_string)sollte jetzt einfach funktionieren.
Ich bekomme eine UnicodeEncodeError: 'charmap' codec can't encode character... Fehlermeldung.
Der Fehler bedeutet, dass Unicode-Zeichen, die Sie drucken möchten, nicht mit der aktuellen ( chcp) Konsolenzeichencodierung dargestellt werden können. Die Codepage ist oft eine 8-Bit-Codierung wie zcp437 , die nur ~ 0x100 Zeichen von ~ 1M Unicode-Zeichen darstellen kann:
>>> u "\ N {EURO SIGN}". encode ('cp437')
Traceback (letzter Anruf zuletzt):
...
UnicodeEncodeError: Der Codec 'charmap' kann das Zeichen '\ u20ac' an Position 0 nicht codieren:
Charakterkarten zu
Ich gehe davon aus, dass die Windows-Konsole keine Nur-Unicode-Zeichen akzeptiert. Was ist der beste Weg, um das zu umgehen?
Die Windows-Konsole akzeptiert Unicode-Zeichen und kann sie sogar anzeigen (nur BMP), wenn die entsprechende Schriftart konfiguriert ist . WriteConsoleW()Die API sollte wie in der Antwort von @Daira Hopwood vorgeschlagen verwendet werden . Es kann transparent aufgerufen werden, dh Sie müssen und sollten Ihre Skripte nicht ändern, wenn Sie das win-unicode-consolePaket verwenden :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Siehe Was ist mit Python 3.4, Unicode, verschiedenen Sprachen und Windows los?
Gibt es eine Möglichkeit, Python automatisch drucken zu lassen, ?anstatt in dieser Situation zu scheitern?
Wenn es ?in Ihrem Fall ausreicht, alle nicht codierbaren Zeichen durch zu ersetzen, können Sie envvar PYTHONIOENCODINGfestlegen :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
In Python 3.6+ wird die von PYTHONIOENCODINGenvvar angegebene Codierung für interaktive Konsolenpuffer ignoriert, es sei denn, PYTHONLEGACYWINDOWSIOENCODINGenvvar ist auf eine nicht leere Zeichenfolge festgelegt.