Lorsque j'essaye d'imprimer une chaîne Unicode dans une console Windows, j'obtiens une UnicodeEncodeError: 'charmap' codec can't encode character ....
erreur. 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? Est-il possible que Python imprime automatiquement un fichier au ?
lieu d'échouer dans cette situation?
Edit: J'utilise Python 2.5.
Remarque: la réponse @ LasseV.Karlsen avec la coche est un peu obsolète (à partir de 2008). Veuillez utiliser les solutions / réponses / suggestions ci-dessous avec précaution !!
La réponse @JFSebastian est plus pertinente à partir d'aujourd'hui (6 janvier 2016).
Réponses:
Remarque: Cette réponse est en quelque sorte dépassée (à partir de 2008). Veuillez utiliser la solution ci-dessous avec précaution !!
Voici une page qui détaille le problème et une solution (recherchez le texte Wrapping sys.stdout dans une instance ):
PrintFails - Wiki Python
Voici un extrait de code de cette page:
Il y a plus d'informations sur cette page, qui valent la peine d'être lues.
la source
sys.stdout
, il imprime les mauvaises choses. Par exemple,u'\u2013'
devientû
au lieu d'un tiret en.cp437
est différente de la page de codes ANSI Windows telle quecp1252
. Le code ne corrige pas l'UnicodeEncodeError: 'charmap' codec can't encode character
erreur et peut conduire à mojibake, par exemple,ا©
est remplacé silencieusement par╪º⌐
.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.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: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 utilisezwin-unicode-console
package :Voir Quel est le problème avec Python 3.4, Unicode, différents langages et Windows?
S'il suffit de remplacer tous les caractères non encodables par
?
dans votre cas, vous pouvez définirPYTHONIOENCODING
envvar :Dans Python 3.6+, l'encodage spécifié par
PYTHONIOENCODING
envvar est ignoré pour les tampons de la console interactive, sauf siPYTHONLEGACYWINDOWSIOENCODING
envvar est défini sur une chaîne non vide.la source
print('\u4E01')
,print('\u6b63')
).Malgré les autres réponses plausibles suggérant de changer la page de codes en 65001, cela ne fonctionne pas . (De plus, changer l'encodage par défaut en utilisant
sys.setdefaultencoding
n'est pas une bonne idée .)Voir cette question pour les détails et le code qui fonctionne.
la source
win-unicode-console
Le package Python (basé sur votre code) permet d'éviter de modifier votre script s'il imprime directement Unicode à l'aide de lapy -mrun your_script.py
commande .Si vous n'êtes pas intéressé à obtenir une représentation fiable du ou des mauvais caractères, vous pouvez utiliser quelque chose comme ceci (en travaillant avec python> = 2.6, y compris 3.x):
Le ou les caractères incorrects de la chaîne seront convertis en une représentation imprimable par la console Windows.
la source
.encode('utf8').decode(sys.stdout.encoding)
mène à mojibake eg,u"\N{EM DASH}".encode('utf-8').decode('cp437')
->ΓÇö
print(s.encode('utf-8'))
Peut-être simplement un meilleur moyen d'éviter les erreurs du compilateur. Au lieu de cela, vous obtenez une sortie \ xNN pour les caractères non imprimables, ce qui était suffisant pour mes messages de diagnostic.Le code ci-dessous rendra la sortie Python vers la console au format UTF-8, même sous Windows.
La console affichera bien les caractères sous Windows 7, mais sous Windows XP, elle ne les affichera pas bien, mais au moins cela fonctionnera et le plus important, vous aurez une sortie cohérente de votre script sur toutes les plates-formes. Vous pourrez rediriger la sortie vers un fichier.
Le code ci-dessous a été testé avec Python 2.6 sur Windows.
la source
import win32console
extérieur d'untry
et plus tard vous le faites conditionnellement à l'intérieur d'untry
? N'est-ce pas inutile (le premierimport
)Entrez simplement ce code en ligne de commande avant d'exécuter le script python:
la source
Comme la réponse de Giampaolo Rodolà, mais encore plus sale: j'ai vraiment, vraiment l'intention de passer beaucoup de temps (bientôt) à comprendre tout le sujet des encodages et comment ils s'appliquent aux consoles Windoze,
Pour le moment je voulais juste sthg ce qui signifierait que mon programme ne CRASH PAS, et ce que j'ai compris ... et aussi qui n'impliquait pas d'importer trop de modules exotiques (en particulier j'utilise Jython, donc la moitié du temps un Python module s'avère en fait pas disponible).
NB "pr" est plus court à taper que "print" (et un peu plus court à taper que "safeprint") ...!
la source
Pour Python 2, essayez:
Pour Python 3, essayez:
Ou essayez win-unicode-console:
la source
TL; DR:
Je suis tombé sur ce problème moi-même, travaillant sur un bot de chat Twitch (IRC). (Python 2.7 dernier)
Je voulais analyser les messages de chat afin de répondre ...
mais également les imprimer en toute sécurité sur la console dans un format lisible par l'homme:
Cela a corrigé le problème des
UnicodeEncodeError: 'charmap'
erreurs de lancement du bot et remplacé les caractères Unicode par?
.la source
La cause de votre problème n'est PAS la console Win qui ne veut pas accepter Unicode (comme elle le fait puisque je suppose que Win2k par défaut). C'est l'encodage système par défaut. Essayez ce code et voyez ce qu'il vous donne:
s'il dit ascii, c'est votre cause ;-) Vous devez créer un fichier appelé sitecustomize.py et le mettre sous le chemin python (je le mets sous /usr/lib/python2.5/site-packages, mais c'est différent sur Win - c'est c: \ python \ lib \ site-packages ou quelque chose), avec le contenu suivant:
et peut-être voudrez-vous également spécifier l'encodage dans vos fichiers:
Edit: plus d'informations peuvent être trouvées dans l'excellent livre Dive into Python
la source
Un peu lié à la réponse de JF Sebastian, mais plus direct.
Si vous rencontrez ce problème lors de l'impression sur la console / le terminal, procédez comme suit:
la source
set PYTHONIOENCODING=UTF-8
peut conduire à mojibake si la console utilise un encodage différent tel que cp437.cp65001
a divers problèmes . Pour imprimer Unicode sur la console Windows, l'API Unicode doit être utilisée (WriteConsoleW()
) comme suggéré dans ma réponse oùPYTHONIOENCODING
est utilisé uniquement pour remplacer les caractères qui ne peuvent pas être représentés dans la page de codes OEM actuelle par?
(WriteConsoleW()
fonctionne même pour de tels caractères).PYTHONIOENCODING
peut être utilisé si la sortie est redirigée vers un fichier.Python 3.6 windows7: Il existe plusieurs façons de lancer un python, vous pouvez utiliser la console python (qui a un logo python dessus) ou la console Windows (il est écrit cmd.exe dessus).
Je n'ai pas pu imprimer les caractères utf8 dans la console Windows. L'impression de caractères utf-8 me renvoie cette erreur:
Après avoir essayé et échoué à comprendre la réponse ci-dessus, j'ai découvert que ce n'était qu'un problème de réglage. Faites un clic droit en haut des fenêtres de la console cmd, sur l'onglet
font
choisi la console lucida.la source
James Sulak a demandé,
D'autres solutions recommandent que nous tentions de modifier l'environnement Windows ou de remplacer la
print()
fonction de Python . La réponse ci-dessous se rapproche de la demande de Sulak.Sous Windows 7, Python 3.5 peut être amené à imprimer Unicode sans lancer un
UnicodeEncodeError
comme suit:Au lieu de:
print(text)
remplacer:
print(str(text).encode('utf-8'))
Au lieu de lancer une exception, Python affiche désormais des caractères Unicode non imprimables sous forme de codes hexadécimaux \ xNN , par exemple:
Halmalo n \ xe2 \ x80 \ x99 \ xc3 \ xa9tait plus qu \ xe2 \ x80 \ x99un point noir
Au lieu de
Halmalo n'était plus qu'un point noir
Certes, ce dernier est préférable ceteris paribus , mais sinon le premier est tout à fait exact pour les messages de diagnostic. Dans la mesure où il affiche Unicode sous forme de valeurs d'octets littérales, le premier peut également aider à diagnostiquer les problèmes d'encodage / décodage.
Remarque: l'
str()
appel ci-dessus est nécessaire car sinonencode()
, Python rejette un caractère Unicode en tant que tuple de nombres.la source