Aggiornamento: Python 3.6 implementa PEP 528: modifica la codifica della console di Windows in UTF-8 : la console predefinita su Windows ora accetterà tutti i caratteri Unicode. Internamente, utilizza la stessa API Unicode del win-unicode-console
pacchetto indicato di seguito . print(unicode_string)
dovrebbe funzionare ora.
Ho ricevuto un UnicodeEncodeError: 'charmap' codec can't encode character...
errore
L'errore indica che i caratteri Unicode che si sta tentando di stampare non possono essere rappresentati utilizzando la chcp
codifica dei caratteri della console corrente ( ). La codepage è spesso una codifica a 8 bit come quella cp437
che può rappresentare solo ~ 0x100 caratteri da ~ 1M caratteri Unicode:
>>> u "\ N {EURO SIGN}". codifica ('cp437')
Traceback (ultima chiamata più recente):
...
UnicodeEncodeError: il codec 'charmap' non può codificare il carattere '\ u20ac' in posizione 0:
il personaggio è mappato a
Suppongo che ciò avvenga perché la console di Windows non accetta caratteri solo Unicode. Qual è il modo migliore per aggirare questo?
La console di Windows accetta i caratteri Unicode e può persino visualizzarli (solo BMP) se il carattere corrispondente è configurato . WriteConsoleW()
L'API deve essere utilizzata come suggerito nella risposta di @Daira Hopwood . Può essere chiamato in modo trasparente, cioè non è necessario e non è necessario modificare gli script se si utilizza il win-unicode-console
pacchetto :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Vedi Qual è il problema con Python 3.4, Unicode, diverse lingue e Windows?
C'è un modo in cui posso fare in modo che Python stampi automaticamente ?
invece di fallire in questa situazione?
Se è sufficiente sostituire tutti i caratteri non codificabili con ?
nel tuo caso, puoi impostare PYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
In Python 3.6+, la codifica specificata da PYTHONIOENCODING
envvar viene ignorata per i buffer della console interattiva a meno che PYTHONLEGACYWINDOWSIOENCODING
envvar non sia impostato su una stringa non vuota.