Mise à jour: Python 3.6 implémente PEP 528: Changez l'encodage de la console Windows en UTF-8 : la console par défaut sous Windows acceptera désormais tous les caractères Unicode. En interne, il utilise la même API Unicode que le win-unicode-console
package mentionné ci-dessous . print(unicode_string)
devrait juste fonctionner maintenant.
J'obtiens une UnicodeEncodeError: 'charmap' codec can't encode character...
erreur.
L'erreur signifie que les caractères Unicode que vous essayez d'imprimer ne peuvent pas être représentés à l'aide du chcp
codage de caractères de la console actuelle ( ). La page de codes est souvent un codage 8 bits tel quecp437
celui-ci ne peut représenter que ~ 0x100 caractères à partir d'environ 1M de caractères Unicode:
>>> u "\ N {EURO SIGN}". encode ('cp437')
Traceback (dernier appel le plus récent):
...
UnicodeEncodeError: le codec 'charmap' ne peut pas encoder le caractère '\ u20ac' en position 0:
personnage correspond à
Je suppose que c'est parce que la console Windows n'accepte pas les caractères Unicode uniquement. Quelle est la meilleure façon de contourner cela?
La console Windows accepte les caractères Unicode et peut même les afficher (BMP uniquement) si la police correspondante est configurée . WriteConsoleW()
L'API doit être utilisée comme suggéré dans la réponse de @Daira Hopwood . Il peut être appelé de manière transparente, c'est-à-dire que vous n'avez pas besoin et ne devez pas modifier vos scripts si vous utilisez win-unicode-console
package :
T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py
Voir Quel est le problème avec Python 3.4, Unicode, différents langages et Windows?
Est-il possible que Python imprime automatiquement un fichier au ?
lieu d'échouer dans cette situation?
S'il suffit de remplacer tous les caractères non encodables par ?
dans votre cas, vous pouvez définir PYTHONIOENCODING
envvar :
T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]
Dans Python 3.6+, l'encodage spécifié par PYTHONIOENCODING
envvar est ignoré pour les tampons de la console interactive, sauf si PYTHONLEGACYWINDOWSIOENCODING
envvar est défini sur une chaîne non vide.