Pembaruan: Python 3.6 mengimplementasikan PEP 528: Ubah pengkodean konsol Windows ke UTF-8 : konsol default pada Windows sekarang akan menerima semua karakter Unicode. Secara internal, ia menggunakan Unicode API yang sama dengan win-unicode-consolepaket yang disebutkan di bawah ini . print(unicode_string)seharusnya hanya bekerja sekarang.
Saya mendapatkan UnicodeEncodeError: 'charmap' codec can't encode character... kesalahan.
Kesalahan berarti bahwa karakter Unicode yang Anda coba cetak tidak dapat diwakili menggunakan chcppengkodean karakter konsol saat ini ( ). Codepage tersebut sering berupa penyandian 8-bit seperticp437 yang hanya bisa mewakili ~ 0x100 karakter dari ~ 1M karakter Unicode:
>>> u "\ N {TANDA EURO}". encode ('cp437')
Traceback (panggilan terakhir terakhir):
...
UnicodeEncodeError: 'charmap' codec tidak dapat menyandikan karakter '\ u20ac' di posisi 0:
peta karakter ke
Saya berasumsi ini karena konsol Windows tidak menerima karakter Unicode-only. Apa cara terbaik untuk mengatasi ini?
Konsol Windows tidak menerima karakter Unicode dan bahkan dapat menampilkannya (hanya BMP) jika font yang sesuai dikonfigurasi . WriteConsoleW()API harus digunakan seperti yang disarankan dalam jawaban @Daira Hopwood . Itu bisa disebut transparan yaitu, Anda tidak perlu dan tidak boleh memodifikasi skrip Anda jika Anda menggunakan win-unicode-consolepaket :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Lihat Apa masalahnya dengan Python 3.4, Unicode, berbagai bahasa dan Windows?
Apakah ada cara saya dapat membuat Python secara otomatis mencetak ?alih - alih gagal dalam situasi ini?
Jika cukup dengan mengganti semua karakter yang tidak dapat dihapus dengan ?dalam kasus Anda maka Anda dapat mengatur PYTHONIOENCODINGenvvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
Dalam Python 3.6+, pengkodean yang ditentukan oleh PYTHONIOENCODINGenvvar diabaikan untuk buffer konsol interaktif kecuali PYTHONLEGACYWINDOWSIOENCODINGenvvar diatur ke string yang tidak kosong.