Cập nhật: Python 3.6 triển khai PEP 528: Thay đổi mã hóa bảng điều khiển Windows thành UTF-8 : bảng điều khiển mặc định trên Windows hiện sẽ chấp nhận tất cả các ký tự Unicode. Bên trong, nó sử dụng các API Unicode tương tự như các win-unicode-console
gói đề cập dưới đây . print(unicode_string)
chỉ nên làm việc bây giờ
Tôi nhận được một UnicodeEncodeError: 'charmap' codec can't encode character...
lỗi.
Lỗi có nghĩa là các ký tự Unicode mà bạn đang cố in không thể được biểu diễn bằng chcp
mã hóa ký tự bảng điều khiển ( ) hiện tại . Bảng mã thường là mã hóa 8 bit cp437
, chỉ có thể biểu thị ~ 0x100 ký tự từ ~ 1M ký tự Unicode:
>>> u "\ N {EURO ĐĂNG KÝ". mã hóa ('cp437')
TracBack (cuộc gọi gần đây nhất vừa qua):
...
UnicodeEncodeError: codec 'charmap' không thể mã hóa ký tự '\ u20ac' ở vị trí 0:
bản đồ nhân vật để
Tôi cho rằng điều này là do bảng điều khiển Windows không chấp nhận các ký tự chỉ Unicode. Cách tốt nhất xung quanh này là gì?
Bảng điều khiển Windows không chấp nhận các ký tự Unicode và thậm chí nó có thể hiển thị chúng (chỉ BMP) nếu phông chữ tương ứng được cấu hình . WriteConsoleW()
API nên được sử dụng như được đề xuất trong câu trả lời của @Daira Hopwood . Nó có thể được gọi một cách minh bạch, tức là bạn không cần và không nên sửa đổi tập lệnh của mình nếu bạn sử dụng win-unicode-console
gói :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Xem Thỏa thuận với Python 3.4, Unicode, các ngôn ngữ khác nhau và Windows là gì?
Có cách nào để tôi có thể khiến Python tự động in ?
thay vì thất bại trong tình huống này không?
Nếu nó đủ để thay thế tất cả các ký tự không thể sửa đổi ?
trong trường hợp của bạn thì bạn có thể đặt PYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
Trong Python 3.6+, mã hóa được chỉ định bởi PYTHONIOENCODING
envvar bị bỏ qua cho bộ đệm bảng điều khiển tương tác trừ khi PYTHONLEGACYWINDOWSIOENCODING
envvar được đặt thành một chuỗi không trống.