อัปเดต: Python 3.6ใช้PEP 528: เปลี่ยนการเข้ารหัสคอนโซล Windows เป็น UTF-8 : ตอนนี้คอนโซลเริ่มต้นบน Windows จะยอมรับอักขระ Unicode ทั้งหมด ภายในจะใช้ Unicode API เช่นเดียวกับแพคเกจดังกล่าวนี้ ควรทำงานตอนนี้win-unicode-console
print(unicode_string)
ฉันได้รับUnicodeEncodeError: 'charmap' codec can't encode character...
ข้อผิดพลาด
ข้อผิดพลาดหมายความว่าอักขระ Unicode ที่คุณพยายามพิมพ์ไม่สามารถแสดงโดยใช้การchcp
เข้ารหัสอักขระคอนโซลปัจจุบัน ( ) เพจรหัสมักจะมีการเข้ารหัส 8 บิตเช่นcp437
ที่สามารถแสดงได้เพียง ~ 0x100 อักขระจาก ~ 1M อักขระ Unicode:
>>> u "\ N {EURO SIGN}". การเข้ารหัส ('cp437')
Traceback (การโทรล่าสุดครั้งล่าสุด):
...
UnicodeEncodeError: ตัวแปลงสัญญาณ 'charmap' ไม่สามารถเข้ารหัสอักขระ '\ u20ac' ในตำแหน่ง 0:
ตัวละครแผนที่ไป
ฉันถือว่านี่เป็นเพราะคอนโซล Windows ไม่ยอมรับอักขระ Unicode เท่านั้น อะไรคือวิธีที่ดีที่สุดในรอบนี้
หน้าต่างคอนโซลไม่ยอมรับอักขระ Unicode และยังสามารถแสดงให้พวกเขา (BMP เท่านั้น) ถ้าตัวอักษรที่สอดคล้องกันมีการกำหนดค่า WriteConsoleW()
API ควรใช้เป็นข้อเสนอแนะในคำตอบของ @Daira เคย สามารถเรียกได้ว่าโปร่งใสนั่นคือคุณไม่จำเป็นต้องและไม่ควรแก้ไขสคริปต์ของคุณหากคุณใช้win-unicode-console
แพ็คเกจ :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
ดูการจัดการกับ Python 3.4, Unicode, ภาษาต่าง ๆ และ Windows คืออะไร
มีวิธีใดบ้างที่ฉันจะทำให้ Python พิมพ์ a โดยอัตโนมัติ?
แทนที่จะล้มเหลวในสถานการณ์นี้
หากมันเพียงพอที่จะแทนที่อักขระที่ไม่สามารถถอดรหัสได้ทั้งหมด?
ในเคสของคุณคุณสามารถตั้งค่าPYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
ใน Python 3.6+ การเข้ารหัสที่ระบุโดยPYTHONIOENCODING
envvar จะถูกละเว้นสำหรับบัฟเฟอร์คอนโซลแบบโต้ตอบเว้นแต่PYTHONLEGACYWINDOWSIOENCODING
envvar จะถูกตั้งค่าเป็นสตริงที่ไม่ว่างเปล่า