Wenn ich versuche, eine Unicode-Zeichenfolge in einer Windows-Konsole zu drucken, wird eine UnicodeEncodeError: 'charmap' codec can't encode character ....
Fehlermeldung angezeigt. Ich gehe davon aus, dass die Windows-Konsole keine Nur-Unicode-Zeichen akzeptiert. Was ist der beste Weg, um das zu umgehen? Gibt es eine Möglichkeit, Python automatisch drucken zu lassen, ?
anstatt in dieser Situation zu scheitern?
Bearbeiten: Ich verwende Python 2.5.
Hinweis: Die Antwort von @ LasseV.Karlsen mit dem Häkchen ist veraltet (ab 2008). Bitte verwenden Sie die unten aufgeführten Lösungen / Antworten / Vorschläge mit Vorsicht !!
Die Antwort von @JFSebastian ist ab heute (6. Januar 2016) relevanter.
Antworten:
Hinweis: Diese Antwort ist veraltet (ab 2008). Bitte verwenden Sie die unten stehende Lösung mit Vorsicht !!
Hier ist eine Seite, auf der das Problem und eine Lösung beschrieben werden (suchen Sie auf der Seite nach dem Text, der sys.stdout in eine Instanz einwickelt ):
PrintFails - Python Wiki
Hier ist ein Code-Auszug von dieser Seite:
Auf dieser Seite finden Sie weitere Informationen, die es wert sind, gelesen zu werden.
quelle
sys.stdout
, werden die falschen Dinge gedruckt. Zum Beispielu'\u2013'
wirdû
anstelle eines en-dash.cp437
von der Windows ANSI-Codepage wie unterscheidetcp1252
. Der Code behebt keinenUnicodeEncodeError: 'charmap' codec can't encode character
Fehler und kann zu Mojibake führen, z. B.ا©
wird er stillschweigend durch ersetzt╪º⌐
.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-console
unten erwähnte Paket .print(unicode_string)
sollte jetzt einfach funktionieren.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: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 daswin-unicode-console
Paket verwenden :Siehe Was ist mit Python 3.4, Unicode, verschiedenen Sprachen und Windows los?
Wenn es
?
in Ihrem Fall ausreicht, alle nicht codierbaren Zeichen durch zu ersetzen, können Sie envvarPYTHONIOENCODING
festlegen :In Python 3.6+ wird die von
PYTHONIOENCODING
envvar angegebene Codierung für interaktive Konsolenpuffer ignoriert, es sei denn,PYTHONLEGACYWINDOWSIOENCODING
envvar ist auf eine nicht leere Zeichenfolge festgelegt.quelle
print('\u4E01')
,print('\u6b63')
).Trotz der anderen plausibel klingenden Antworten, die darauf hindeuten, die Codepage auf 65001 zu ändern, funktioniert dies nicht . (Außerdem
sys.setdefaultencoding
ist es keine gute Idee , die Standardcodierung mit zu ändern .)In dieser Frage finden Sie Details und Code, der funktioniert.
quelle
win-unicode-console
Mit dem Python-Paket (basierend auf Ihrem Code) können Sie vermeiden, dass Ihr Skript geändert wird, wenn Unicode direkt mit dempy -mrun your_script.py
Befehl gedruckt wird .Wenn Sie nicht daran interessiert sind, eine zuverlässige Darstellung der fehlerhaften Zeichen zu erhalten, können Sie Folgendes verwenden (Arbeiten mit Python> = 2.6, einschließlich 3.x):
Die fehlerhaften Zeichen in der Zeichenfolge werden in eine Darstellung konvertiert, die von der Windows-Konsole gedruckt werden kann.
quelle
.encode('utf8').decode(sys.stdout.encoding)
führt zu Mojibake zB,u"\N{EM DASH}".encode('utf-8').decode('cp437')
->ΓÇö
print(s.encode('utf-8'))
kann ein besserer Weg sein, um Compilerfehler zu vermeiden. Stattdessen erhalten Sie eine \ xNN-Ausgabe für nicht druckbare Zeichen, was für meine Diagnosemeldungen ausreichte.Mit dem folgenden Code wird Python auch unter Windows als UTF-8 an die Konsole ausgegeben.
Die Konsole zeigt die Zeichen unter Windows 7 gut an, aber unter Windows XP werden sie nicht gut angezeigt, aber zumindest funktioniert es und vor allem haben Sie auf allen Plattformen eine konsistente Ausgabe Ihres Skripts. Sie können die Ausgabe in eine Datei umleiten.
Der folgende Code wurde mit Python 2.6 unter Windows getestet.
quelle
import win32console
außerhalb von atry
und später machst du es bedingt innerhalb von atry
? Ist das nicht sinnlos (der ersteimport
)Geben Sie einfach diesen Code in die Befehlszeile ein, bevor Sie das Python-Skript ausführen:
quelle
Wie die Antwort von Giampaolo Rodolà, aber noch schmutziger: Ich beabsichtige wirklich, wirklich lange (bald) das gesamte Thema der Codierungen und deren Anwendung auf Windoze-Konsolen zu verstehen.
Im Moment wollte ich nur etwas, was bedeuten würde, dass mein Programm NICHT abstürzt, und was ich verstand ... und das auch nicht das Importieren zu vieler exotischer Module beinhaltete (insbesondere verwende ich Jython, also die Hälfte der Zeit ein Python Modul stellt sich tatsächlich als nicht verfügbar heraus).
NB "pr" ist kürzer als "print" (und viel kürzer als "safeprint") ...!
quelle
Für Python 2 versuchen Sie:
Für Python 3 versuchen Sie:
Oder versuchen Sie es mit der Win-Unicode-Konsole:
quelle
TL; DR:
Ich bin selbst darauf gestoßen und habe an einem Twitch-Chat-Bot (IRC) gearbeitet. (Python 2.7 spätestens)
Ich wollte Chat-Nachrichten analysieren, um zu antworten ...
Drucken Sie sie aber auch sicher in einem für Menschen lesbaren Format auf die Konsole:
Dies behebt das Problem, dass der Bot
UnicodeEncodeError: 'charmap'
Fehler auslöst, und ersetzt die Unicode-Zeichen durch?
.quelle
Die Ursache Ihres Problems ist NICHT, dass die Win-Konsole nicht bereit ist, Unicode zu akzeptieren (da dies der Fall ist, da ich Win2k standardmäßig schätze). Dies ist die Standardsystemcodierung. Probieren Sie diesen Code aus und sehen Sie, was er Ihnen bietet:
Wenn es ASCII heißt, gibt es deine Ursache ;-) Du musst eine Datei namens sitecustomize.py erstellen und sie unter den Python-Pfad stellen (ich habe sie unter /usr/lib/python2.5/site-packages abgelegt, aber das ist anders Win - es ist c: \ python \ lib \ site-packages oder so) mit folgendem Inhalt:
und vielleicht möchten Sie auch die Codierung in Ihren Dateien angeben:
Bearbeiten: Weitere Informationen finden Sie im Dive in Python-Buch
quelle
Ein bisschen verwandt mit der Antwort von JF Sebastian, aber direkter.
Wenn beim Drucken auf die Konsole / das Terminal dieses Problem auftritt, gehen Sie wie folgt vor:
quelle
set PYTHONIOENCODING=UTF-8
kann zu Mojibake führen, wenn die Konsole eine andere Codierung wie cp437 verwendet.cp65001
hat verschiedene Probleme . Um Unicode auf der Windows-Konsole zu drucken, sollte die Unicode-API verwendet werden (WriteConsoleW()
), wie in meiner Antwort vorgeschlagen. DabeiPYTHONIOENCODING
werden nur Zeichen ersetzt, die in der aktuellen OEM-Codepage nicht dargestellt werden können?
(WriteConsoleW()
funktioniert auch für solche Zeichen).PYTHONIOENCODING
kann verwendet werden, wenn die Ausgabe in eine Datei umgeleitet wird.Python 3.6 Windows 7: Es gibt verschiedene Möglichkeiten, eine Python zu starten. Sie können die Python-Konsole (auf der sich ein Python-Logo befindet) oder die Windows-Konsole (auf der cmd.exe steht) verwenden.
Ich konnte keine utf8-Zeichen in der Windows-Konsole drucken. Das Drucken von utf-8-Zeichen wirft mir diesen Fehler:
Nachdem ich versucht hatte, die obige Antwort zu verstehen, stellte ich fest, dass es sich nur um ein Einstellungsproblem handelte. Klicken Sie mit der rechten Maustaste oben in den Fenstern der cmd-Konsole und wählen Sie auf der Registerkarte
font
lucida console aus.quelle
James Sulak fragte:
Andere Lösungen empfehlen, dass wir versuchen, die Windows-Umgebung zu ändern oder die Python-
print()
Funktion zu ersetzen . Die folgende Antwort kommt der Erfüllung der Anfrage von Sulak näher.Unter Windows 7 kann Python 3.5 dazu gebracht werden, Unicode zu drucken, ohne
UnicodeEncodeError
Folgendes zu werfen :Anstelle von:
print(text)
Ersatz:
print(str(text).encode('utf-8'))
Anstatt eine Ausnahme auszulösen, zeigt Python jetzt nicht druckbare Unicode-Zeichen als \ xNN- Hex-Codes an, z.
Halmalo n \ xe2 \ x80 \ x99 \ xc3 \ xa9tait plus qu \ xe2 \ x80 \ x99un point noir
Anstatt
Halmalo n'était plus qu'un point noir
Zugegeben, letzteres ist ceteris paribus vorzuziehen , ansonsten ist Ersteres für diagnostische Meldungen völlig korrekt. Da Unicode als Literalbytewerte angezeigt wird, kann ersteres auch bei der Diagnose von Codierungs- / Decodierungsproblemen hilfreich sein.
Hinweis: Der
str()
obige Aufruf ist erforderlich, daencode()
Python andernfalls ein Unicode-Zeichen als Tupel von Zahlen ablehnt.quelle