Python -, Unicode-und die Windows-Konsole
Wenn ich versuche, drucken Sie eine Unicode-Zeichenfolge in eine Windows-Konsole, bekomme ich eine UnicodeEncodeError: 'charmap' codec can't encode character ....
Fehler. Ich nehme an, dies ist, weil die Windows Konsole nicht akzeptieren, nur-Unicode-Zeichen. Was ist der beste Weg, um dieses? Gibt es eine Möglichkeit, ich kann Python automatisch ausgedruckt ?
statt Versagen in dieser situation?
Edit: ich bin mit Python 2.5.
Hinweis: @LasseV.Karlsen Antwort mit den Häkchen ist irgendwie veraltet (von 2008). Bitte verwenden Sie die Lösungen/Antworten/Kommentaren unten mit Sorgfalt!!
@JFSebastian Antwort ist relevanter als heute (6 Jan 2016).
Welche version von Python sind Sie auf? Ich habe gesehen, Referenzen, dass diese gebrochen war in 2.4.3 und Feste in 2.4.4.
Verwandte: bugs.python.org/issue1602
check dieser aus.
die einfache Antwort, die ich fand, ist zu geben: chcp 65001 vor der Verwendung von Python ist es notwendig Sie in cmd ein
Dann sollten Sie Ihre Antwort akzeptiert...
Verwandte: bugs.python.org/issue1602
check dieser aus.
die einfache Antwort, die ich fand, ist zu geben: chcp 65001 vor der Verwendung von Python ist es notwendig Sie in cmd ein
Dann sollten Sie Ihre Antwort akzeptiert...
InformationsquelleAutor James Sulak | 2008-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: Diese Antwort ist irgendwie veraltet (von 2008). Bitte verwenden Sie die Lösung unten!!
Hier ist eine Seite, die details des Problems und eine Lösung (suchen Sie die Seite für den text Verpackung sys.stdout in eine Instanz):
PrintFails - Python-Wiki
Hier ein code-Auszug von dieser Seite:
Gibt es einige weitere Informationen auf dieser Seite, lohnt sich zu Lesen.
Der link funktioniert jetzt, aber es ist nicht ganz klar, was es vermuten lässt.
Wenn ich versuche die Ratschläge zu wickeln
sys.stdout
, druckt es die falschen Dinge. Zum Beispielu'\u2013'
wirdû
statt ein en-dash.Sie haben post eine neue Frage. Unicode-und system-Konsole nicht unbedingt die beste Kombination, aber ich weiß nicht genug über dieses, also, wenn Sie brauchen eine eindeutige Antwort, poste hier eine Frage auf, SO über ihn.
der link ist tot. Das code-Beispiel ist falsch, für die Windows-Konsole, wo der Zeichensatz (OEM) wie
cp437
unterscheidet sich von Windows-ANSI-codepage wiecp1252
. Der code ist nicht fixUnicodeEncodeError: 'charmap' codec can't encode character
Fehler und kann dazu führen, mojibake z.B.ا©
wird automatisch ersetzt mit╪º⌐
.InformationsquelleAutor Lasse Vågsæther Karlsen
Update: Python-3.6 implementiert PEP 528: Ändern Sie die Windows-console encoding auf UTF-8: die Standard-Konsole unter Windows akzeptiert nun alle Unicode Zeichen. Intern verwendet es den gleichen Unicode-API als die
win-unicode-Konsole
- Paket, die unten erwähnt werden.print(unicode_string)
sollte einfach funktionieren jetzt.Der Fehler bedeutet, dass Unicode-Zeichen, die Sie drucken möchten, können nicht dargestellt werden unter Verwendung der aktuellen (
chcp
) Konsole Zeichencodierung. Die codepage wird oft 8-bit-Codierung, wiecp437
vertreten kann nur ~0x100 Zeichen aus ~1M Unicode-Zeichen:Windows-Konsole akzeptiert Unicode-Zeichen und kann Sie auch anzeigen (nur BMP) , wenn die entsprechende schriftart konfiguriert ist.
WriteConsoleW()
- API verwendet werden sollte, wie vorgeschlagen, in @Daira Hopwood Antwort. Es kann aufgerufen werden, transparent, d.h., Sie müssen nicht und sollten Sie nicht passen Sie Ihre Skripte wenn Siewin-unicode-Konsole
- Paket:Sehen Was ist der deal mit Python 3.4, Unicode, verschiedene Sprachen und Windows?
Wenn es ist genug, um zu ersetzen Sie alle unencodable Zeichen mit
?
in deinem Fall dann konnten SiePYTHONIOENCODING
envvar:In Python 3.6+, das angegebene Kodierung von
PYTHONIOENCODING
envvar ist, ignoriert interactive Konsole Puffer, es sei dennPYTHONLEGACYWINDOWSIOENCODING
envvar gesetzt ist, um einen nicht-leeren string.die Antwort enthält der Satz in bold über die Windows-Konsole: "wenn die entsprechende schriftart konfiguriert ist." Diese Antwort nicht erwähnt, im LEERLAUF aber Sie brauchen nicht zu konfigurieren, die schriftart in es (sehe ich japanische und chinesische Zeichen nur in Ordnung, im IDLE per default. Versuchen
print('\u4E01')
,print('\u6b63')
).Sie können sogar die Chinesen, wenn Sie das language pack installieren in Windows 10. Er fügte hinzu, Konsole-fonts, Unterstützung Chinesisch.
InformationsquelleAutor jfs
Trotz der anderen plausibel klingende Antworten, die nahelegen, dass die änderung der Codepage auf 65001, dass funktioniert nicht. (Auch die änderung der Standard-Codierung mit
sys.setdefaultencoding
ist keine gute Idee.)Sehen diese Frage für details und code, der funktioniert.
win-unicode-console
Python-Paket (basierend auf den code) zu vermeiden, ändern Sie Ihr Skript, wenn es druckt Unicode direkt mitpy -mrun your_script.py
Befehl.InformationsquelleAutor Daira Hopwood
Wenn Sie nicht daran interessiert, eine zuverlässige Darstellung der schlechte Charakter(en), die Sie vielleicht so etwas wie dies (das arbeiten mit python >= 2.6, darunter 3.x):
Den schlechten Charakter(s) in der Zeichenfolge umgewandelt werden in eine Darstellung, die druckbar ist, indem Sie die Windows-Konsole.
.encode('utf8').decode(sys.stdout.encoding)
führt zu mojibake z.B.u"\N{EM DASH}".encode('utf-8').decode('cp437')
->ΓÇö
Einfach
print(s.encode('utf-8'))
einen besseren Weg, um Compilerfehler zu vermeiden. Stattdessen erhalten Sie \xNN-Ausgang für nicht druckbare Zeichen, das war genug für meine Diagnose-Nachrichten.Das ist enorm, spektakulär falsch. Codierung auf UTF-8 dann Dekodierung, wie eine 8-bit-Zeichensatz wird a) oft nicht, nicht alle Zeichensätze sind Zeichen für alle 256 byte-Werten und b) immer die falsche interpretation der Daten, Erstellung einer Mojibake, Chaos statt.
InformationsquelleAutor Giampaolo Rodolà
Den untenstehenden code wird in Python Ausgabe auf die Konsole als UTF-8 auch auf Windows.
In der Konsole display das Zeichen auch auf Windows 7, aber auf Windows XP wird Sie nicht angezeigt, Sie gut, aber zumindest wird es funktionieren, und die meisten wichtig, Sie haben eine einheitliche Ausgabe aus dem Skript auf allen Plattformen. Sie werden in der Lage sein, um die Umleitung der Ausgabe in eine Datei.
Code unten getestet wurde mit Python 2.6 unter Windows.
cp65001 != utf-8
Warum tun Sie zuerst
import win32console
außerhalb einertry
- und später macht man es bedingt innerhalb einestry
? Ist das nicht irgendwie sinnlos (die erstenimport
)Für was es Wert ist, die von David-Sarah Hopwood funktioniert (ich habe nicht diese ein, um auch laufen, denn ich habe mir nicht die Mühe gemacht die Installation der win32-Erweiterungen-Modul)
Ändern Sie nicht das system default encoding; Update Ihrer Unicode-Werte statt. Ändern der Standard-Codierung zu brechen Bibliotheken, die sich auf die, wissen Sie, default. Es gibt einen Grund, Sie zu zwingen, ein Modul laden, bevor Sie dies tun können.
InformationsquelleAutor sorin
Wie Giampaolo Rodolà Antwort, aber noch mehr dirty: ich wirklich, wirklich wollen, um Sie verbringen eine lange Zeit (bald) verstehen das ganze Thema Codierungen und wie Sie sich auf windoof Konsolen,
Für den moment wollte ich nur sthg was bedeuten würde, mein Programm würde NICHT ABSTÜRZEN, und das habe ich verstanden ... und auch die waren nicht mit importieren, zu viele exotische Module (insbesondere ich bin mit Jython, also die Hälfte der Zeit ein Python-Modul, erweist sich in der Tat nicht verfügbar zu sein).
NB "pr" ist kürzer-Typ als "drucken" (und durchaus ein bisschen kürzer zu geben, als "safeprint")...!
InformationsquelleAutor mike rodent
Geben Sie einfach diesen code in die Kommandozeile vor der Ausführung des python-Skript:
InformationsquelleAutor c97
Für Python 2 try:
Für Python 3 versuchen:
Oder versuchen, win-unicode-Konsole:
InformationsquelleAutor shubaly
Die Ursache des Problems ist NICHT die Win-Konsole nicht bereit zu akzeptieren, Unicode (wie es das macht, da ich vermute, Win2k standardmäßig). Es ist die Standard-system-Codierung. Versuchen, diesen code und sehen, was es gibt Sie:
wenn er sagt, ascii, es ist deine Sache 😉
Sie müssen erstellen Sie eine Datei namens sitecustomize.py und legte es unter python-Pfad (ich habe es unter /usr/lib/python2.5/site-packages, aber das ist anderer Weg auf Win - es ist c:\python\lib\site-packages oder etwas) mit dem folgenden Inhalt:
und vielleicht möchten Sie vielleicht, um die Kodierung angeben, die in Ihren Dateien sowie:
Edit: mehr Infos finden Sie in ausgezeichneter Dive into Python Buch
Ich kann nicht beweisen, dass es gerade jetzt, aber ich weiß, dass ich verwendet habe, diesen trick auf eine spätere version 2.5 auf Windows.
OK, nach einer Weile habe ich herausgefunden, dass: "Diese Funktion soll nur verwendet werden, indem die site-module-Umsetzung und, soweit erforderlich, durch sitecustomize. Früher die Website Modul, es ist entfernt von dem sys-Modul-namespace."
tatsächlich können Sie die windows-Konsole auf utf-8. Sie müssen sagen chcp 65001 und es werden unicode.
Um absolut deutlich zu machen: es ist eine sehr schlechte Idee zum ändern der Standard-Kodierung. Das ist vergleichbar mit spalking Ihrem gebrochenen Bein und Fuß auf, als wäre nichts geschehen, anstatt einen Arzt, legen Sie die Knochen richtig. Alle code-handling von Unicode-text sollte tun, so konsequent, anstatt sich auf implizite Kodierung / Dekodierung.
InformationsquelleAutor Bartosz Radaczyński
TL;DR:
Lief ich in diesem mich, die Arbeit auf einem Twitch-chat (IRC) - bot. (Python 2.7 die Letzte)
Wollte ich analysieren, chat-Nachrichten, um zu reagieren...
aber auch drucken, die Sie sicher auf die Konsole in eine lesbare format:
Dies korrigiert das Problem, der bot wirft
UnicodeEncodeError: 'charmap'
Fehler und ersetzt die unicode-Zeichen mit?
.InformationsquelleAutor Matthew Estock
Art von Bezug auf die Antwort von J. F. Sebastian, aber mehr direkter.
Wenn Sie ein problem beim drucken auf der Konsole/terminal, dann tun Sie dies:
set PYTHONIOENCODING=UTF-8
führen kann mojibake, wenn die Konsole verwendet eine andere Codierung wie cp437.cp65001
hat verschiedene Probleme. Drucken von Unicode, Windows-Konsole Unicode-API verwendet werden sollte (WriteConsoleW()
), wie empfohlen, in meine Antwort woPYTHONIOENCODING
wird nur verwendet, um Zeichen zu ersetzen, können nicht dargestellt werden, die in der aktuellen OEM-Codepage mit?
(WriteConsoleW()
funktioniert auch für solche Charaktere).PYTHONIOENCODING
können verwendet werden, wenn die Ausgabe in eine Datei umgeleitet.InformationsquelleAutor Kinjal Dixit
Python 3.6 windows7: Es gibt mehrere Wege, um starten Sie eine python können Sie mit der python-Konsole (das ist ein python-logo drauf) oder die windows-Konsole (es ist geschrieben cmd.exe auf es).
Konnte ich nicht drucken utf8-Zeichen in der windows-Konsole. Drucken utf-8-Zeichen, werfen mir diese Fehlermeldung:
Nach dem Versuch und scheitern zu verstehen, die Antwort oben habe ich entdeckt, es war nur ein Einstellung problem. Klicken Sie rechts oben auf der cmd-Konsole von windows auf der Registerkarte
font
wählte lucida console.InformationsquelleAutor J. Does
James Sulak gefragt,
Andere Lösungen empfehlen, die wir zu ändern versuchen die Windows-Umgebung oder ersetzen von Python -
print()
Funktion. Die Antwort unten kommt näher an die Erfüllung Sulak verlangen.Unter Windows 7, Python 3.5 werden können, um zu drucken Unicode ohne auslösen einer
UnicodeEncodeError
wie folgt:anstelle von:
print(text)
Ersatz:
print(str(text).encode('utf-8'))
Statt eine Ausnahme zu werfen, Python jetzt zeigt nicht druckbare Unicode-Zeichen als \xNN hex-codes, z.B.:
Halmalo n\xe2\x80\x99\xc3\xa9tait plus qu\xe2\x80\x99un point noir
Statt
Halmalo n'était plus qu ' un point noir
Zugegeben, letzteres ist vorzuziehen ceteris paribus, aber ansonsten ist das erstere ist völlig korrekt für Diagnosemeldungen. Weil es zeigt Unicode-literal byte-Werte der ehemaligen kann auch helfen, die Diagnose codieren/decodieren Probleme.
Hinweis: Die
str()
obige Aufruf ist notwendig, weil sonstencode()
Ursachen Python abzulehnen, ein Unicode-Zeichen als ein Tupel von zahlen.InformationsquelleAutor CODE-REaD