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-console
paket 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 chcp
pengkodean 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-console
paket :
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 PYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
Dalam Python 3.6+, pengkodean yang ditentukan oleh PYTHONIOENCODING
envvar diabaikan untuk buffer konsol interaktif kecuali PYTHONLEGACYWINDOWSIOENCODING
envvar diatur ke string yang tidak kosong.