Оновлення: Python 3.6 реалізує PEP 528: Змініть кодування консолі Windows на UTF-8 : консоль за замовчуванням у Windows тепер прийме всі символи Unicode. Внутрішньо він використовує той же API Unicode, що і win-unicode-console
пакет, згаданий нижче . print(unicode_string)
повинні просто працювати зараз.
Я отримую UnicodeEncodeError: 'charmap' codec can't encode character...
помилку.
Помилка означає, що символи Unicode, які ви намагаєтеся надрукувати, не можуть бути представлені за допомогою поточного ( chcp
) кодування символів консолі. Кодова сторінка часто 8-бітове кодування, таке, cp437
яке може представляти лише ~ 0x100 символів з ~ 1M символів Unicode:
>>> u "\ N {EURO SIGN}". encode ('cp437')
Traceback (останній останній дзвінок):
...
UnicodeEncodeError: кодек "charmap" не може кодувати символ "\ u20ac" у позиції 0:
символьні карти до
Я припускаю, що це тому, що консоль Windows не приймає символи, призначені лише для Unicode. Який найкращий спосіб обійти це?
Консоль Windows приймає символи Unicode і навіть може відображати їх (лише BMP), якщо відповідний шрифт налаштований . WriteConsoleW()
API слід використовувати, як пропонується у відповіді @Daira Hopwood . Це можна назвати прозоро, тобто вам не потрібно і не слід змінювати свої сценарії, якщо ви використовуєте win-unicode-console
пакет :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Дивіться, у чому полягає угода з Python 3.4, Unicode, різними мовами та Windows?
Чи є спосіб, щоб я міг змусити Python автоматично друкувати, ?
а не відмовлятись у цій ситуації?
Якщо ?
у вашому випадку достатньо замінити всі символи, які не можна PYTHONIOENCODING
розшифрувати, тоді ви можете встановити envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
У Python 3.6+, кодування, визначене PYTHONIOENCODING
envvar, ігнорується для інтерактивних консольних буферів, якщо PYTHONLEGACYWINDOWSIOENCODING
envvar не встановлено на порожню рядок.