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-consoleopakowaniu 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 chcpkodowania znaków konsoli. Strona kodowa jest często cp437kodowana 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-consolepakietu :
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ć PYTHONIOENCODINGenvvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
W Pythonie PYTHONIOENCODING3.6+ kodowanie określone przez envvar jest ignorowane dla buforów konsoli interaktywnej, chyba że PYTHONLEGACYWINDOWSIOENCODINGenvvar jest ustawiony na niepusty ciąg.