Aktualizacja: Python 3.6 implementuje PEP 528: Zmień kodowanie konsoli systemu Windows na UTF-8 : domyślna konsola w systemie Windows będzie teraz akceptować wszystkie znaki Unicode. Wewnętrznie używa tego samego API Unicode jak na win-unicode-console
opakowaniu wymienionym poniżej . print(unicode_string)
powinno teraz działać.
Pojawia się UnicodeEncodeError: 'charmap' codec can't encode character...
błąd.
Ten błąd oznacza, że znaki Unicode, które próbujesz wydrukować, nie mogą być reprezentowane przy użyciu bieżącego chcp
kodowania znaków konsoli. Strona kodowa jest często cp437
kodowana 8-bitowo, na przykład może reprezentować tylko ~ 0x100 znaków z ~ 1 M znaków Unicode:
>>> u "\ N {EURO SIGN}". encode ('cp437')
Traceback (ostatnie ostatnie połączenie):
...
UnicodeEncodeError: kodek „charmap” nie może zakodować znaku „\ u20ac” na pozycji 0:
mapy znaków do
Zakładam, że dzieje się tak, ponieważ konsola systemu Windows nie akceptuje znaków tylko w Unicode. Jaki jest najlepszy sposób obejścia tego?
Konsola systemu Windows akceptuje znaki Unicode, a nawet może je wyświetlać (tylko BMP), jeśli skonfigurowano odpowiednią czcionkę . WriteConsoleW()
API należy używać zgodnie z sugestią zawartą w odpowiedzi @Daira Hopwood . Można to nazwać transparentnie, tzn. Nie musisz i nie powinieneś modyfikować swoich skryptów, jeśli używasz win-unicode-console
pakietu :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Zobacz O co chodzi z Pythonem 3.4, Unicode, różnymi językami i systemem Windows?
Czy jest jakiś sposób, żebym mógł sprawić, by Python automatycznie drukował ?
zamiast niepowodzenia w tej sytuacji?
Jeśli ?
w twoim przypadku wystarczy zamienić wszystkie niekodowalne znaki na, możesz ustawić PYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
W Pythonie PYTHONIOENCODING
3.6+ kodowanie określone przez envvar jest ignorowane dla buforów konsoli interaktywnej, chyba że PYTHONLEGACYWINDOWSIOENCODING
envvar jest ustawiony na niepusty ciąg.