Ketika saya mencoba untuk mencetak string Unicode di konsol Windows, saya mendapatkan UnicodeEncodeError: 'charmap' codec can't encode character ....
kesalahan. Saya berasumsi ini karena konsol Windows tidak menerima karakter Unicode-only. Apa cara terbaik untuk mengatasi ini? Apakah ada cara saya dapat membuat Python secara otomatis mencetak ?
alih - alih gagal dalam situasi ini?
Sunting: Saya menggunakan Python 2.5.
Catatan: @ LasseV.Karlsen menjawab dengan tanda centang agak ketinggalan jaman (dari 2008). Silakan gunakan solusi / jawaban / saran di bawah ini dengan hati-hati !!
Jawaban @JFSebastian lebih relevan mulai hari ini (6 Jan 2016).
Jawaban:
Catatan: Jawaban ini agak ketinggalan jaman (dari 2008). Silakan gunakan solusi di bawah ini dengan hati-hati !!
Berikut adalah halaman yang merinci masalah dan solusinya (cari halaman untuk teks Wrapping sys.stdout menjadi contoh ):
PrintFails - Python Wiki
Berikut kutipan kode dari halaman itu:
Ada beberapa informasi lebih lanjut di halaman itu, layak dibaca.
sumber
sys.stdout
, itu mencetak hal-hal yang salah. Misalnya,u'\u2013'
menjadiû
bukan en-dash.cp437
berbeda dari codepage Windows ANSI seperticp1252
. Kode tidak memperbaikiUnicodeEncodeError: 'charmap' codec can't encode character
kesalahan dan dapat menyebabkan mojibake misalnya,ا©
diganti dengan diam-diam╪º⌐
.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.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: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 menggunakanwin-unicode-console
paket :Lihat Apa masalahnya dengan Python 3.4, Unicode, berbagai bahasa dan Windows?
Jika cukup dengan mengganti semua karakter yang tidak dapat dihapus dengan
?
dalam kasus Anda maka Anda dapat mengaturPYTHONIOENCODING
envvar :Dalam Python 3.6+, pengkodean yang ditentukan oleh
PYTHONIOENCODING
envvar diabaikan untuk buffer konsol interaktif kecualiPYTHONLEGACYWINDOWSIOENCODING
envvar diatur ke string yang tidak kosong.sumber
print('\u4E01')
,print('\u6b63')
).Meskipun jawaban terdengar masuk akal lainnya yang menyarankan mengubah halaman kode ke 65001, itu tidak bekerja . (Juga, mengubah default encoding menggunakan
sys.setdefaultencoding
adalah bukan ide yang baik .)Lihat pertanyaan ini untuk detail dan kode yang berfungsi.
sumber
win-unicode-console
Paket python (berdasarkan kode Anda) memungkinkan untuk menghindari memodifikasi skrip Anda jika mencetak Unicode langsung menggunakanpy -mrun your_script.py
perintah .Jika Anda tidak tertarik untuk mendapatkan representasi karakter buruk yang dapat diandalkan, Anda dapat menggunakan sesuatu seperti ini (bekerja dengan python> = 2.6, termasuk 3.x):
Karakter buruk dalam string akan dikonversi dalam representasi yang dapat dicetak oleh konsol Windows.
sumber
.encode('utf8').decode(sys.stdout.encoding)
mengarah ke mojibake misalnya,u"\N{EM DASH}".encode('utf-8').decode('cp437')
->ΓÇö
print(s.encode('utf-8'))
mungkin cara yang lebih baik untuk menghindari kesalahan kompiler. Sebagai gantinya, Anda mendapatkan \ xNN output untuk karakter yang tidak patut, yang cukup untuk pesan diagnostik saya.Kode di bawah ini akan membuat output Python ke konsol sebagai UTF-8 bahkan di Windows.
Konsol akan menampilkan karakter dengan baik di Windows 7 tetapi pada Windows XP tidak akan menampilkannya dengan baik, tetapi setidaknya itu akan berfungsi dan yang paling penting Anda akan memiliki output yang konsisten dari skrip Anda di semua platform. Anda akan dapat mengarahkan output ke file.
Kode di bawah ini diuji dengan Python 2.6 pada Windows.
sumber
import win32console
keluartry
dan kemudian melakukannya secara kondisional di dalam atry
? Bukankah itu tidak ada gunanya (yang pertamaimport
)Cukup masukkan kode ini di baris perintah sebelum menjalankan skrip python:
sumber
Seperti jawaban Giampaolo Rodolà, tetapi bahkan lebih kotor: Saya benar-benar bermaksud menghabiskan waktu lama (segera) untuk memahami seluruh subjek pengkodean dan bagaimana mereka berlaku untuk konsol Windoze,
Untuk saat ini saya hanya ingin sthg yang berarti program saya TIDAK akan rusak, dan yang saya mengerti ... dan juga yang tidak melibatkan mengimpor terlalu banyak modul eksotis (khususnya saya menggunakan Jython, jadi separuh waktu Python Modul ternyata tidak tersedia).
NB "pr" lebih pendek daripada "print" (dan sedikit lebih pendek untuk mengetik daripada "safeprint") ...!
sumber
Untuk Python 2 coba:
Untuk Python 3 coba:
Atau coba win-unicode-console:
sumber
TL; DR:
Saya mengalami ini sendiri, mengerjakan bot Twitch chat (IRC). (Python 2.7 terbaru)
Saya ingin menguraikan pesan obrolan untuk menanggapi ...
tetapi juga mencetaknya dengan aman ke konsol dalam format yang dapat dibaca manusia:
Ini memperbaiki masalah
UnicodeEncodeError: 'charmap'
kesalahan melempar bot dan mengganti karakter unicode dengan?
.sumber
Penyebab masalah Anda BUKAN konsol Win tidak mau menerima Unicode (seperti ini karena saya kira Win2k secara default). Ini adalah penyandian sistem default. Coba kode ini dan lihat apa yang memberi Anda:
jika dikatakan ascii, itu penyebab Anda ;-) Anda harus membuat file bernama sitecustomize.py dan meletakkannya di bawah jalur python (saya meletakkannya di bawah /usr/lib/python2.5/site-packages, tapi itu berbeda pada Menang - ini adalah c: \ python \ lib \ situs-paket atau sesuatu), dengan konten berikut:
dan mungkin Anda mungkin ingin menentukan pengkodean dalam file Anda juga:
Sunting: info lebih lanjut dapat ditemukan di buku Dive into Python
sumber
Agak terkait dengan jawaban oleh JF Sebastian, tetapi lebih langsung.
Jika Anda mengalami masalah ini saat mencetak ke konsol / terminal, maka lakukan ini:
sumber
set PYTHONIOENCODING=UTF-8
dapat menyebabkan mojibake jika konsol menggunakan penyandian yang berbeda seperti cp437.cp65001
memiliki berbagai masalah . Untuk mencetak Unicode ke konsol Windows, Unicode API harus digunakan (WriteConsoleW()
) seperti yang disarankan dalam jawaban saya di manaPYTHONIOENCODING
hanya digunakan untuk mengganti karakter yang tidak dapat diwakili dalam halaman kode OEM saat ini dengan?
(WriteConsoleW()
berfungsi bahkan untuk karakter tersebut).PYTHONIOENCODING
dapat digunakan jika output diarahkan ke file.Python 3.6 windows7: Ada beberapa cara untuk meluncurkan python Anda bisa menggunakan konsol python (yang memiliki logo python di atasnya) atau konsol windows (ada tertulis cmd.exe di atasnya).
Saya tidak dapat mencetak karakter utf8 di konsol windows. Mencetak utf-8 karakter membuat saya kesalahan ini:
Setelah mencoba dan gagal untuk memahami jawaban di atas saya menemukan itu hanya masalah pengaturan. Klik kanan di bagian atas jendela konsol cmd, pada tab
font
pilih konsol lucida.sumber
James Sulak bertanya,
Solusi lain menyarankan agar kami mencoba mengubah lingkungan Windows atau mengganti
print()
fungsi Python . Jawaban di bawah ini semakin mendekati untuk memenuhi permintaan Sulak.Di bawah Windows 7, Python 3.5 dapat dibuat untuk mencetak Unicode tanpa melempar
UnicodeEncodeError
sebagai berikut:Di tempat:
print(text)
pengganti:
print(str(text).encode('utf-8'))
Alih-alih melempar pengecualian, Python sekarang menampilkan karakter Unicode yang tidak dapat dicetak sebagai \ xNN kode hex, misalnya:
Halmalo n \ xe2 \ x80 \ x99 \ xc3 \ xa9tait plus qu \ xe2 \ x80 \ x99un point noir
Dari pada
Halmalo n'était plus qu'un point noir
Memang, yang terakhir lebih disukai ceteris paribus , tetapi sebaliknya yang pertama sepenuhnya akurat untuk pesan diagnostik. Karena menampilkan Unicode sebagai nilai byte literal, yang pertama juga dapat membantu dalam mendiagnosis masalah penyandian / penyandian sandi.
Catatan: The
str()
panggilan di atas diperlukan karena jika tidakencode()
menyebabkan Python untuk menolak karakter Unicode sebagai tupel nomor.sumber