J'ai quelques problèmes en essayant d'encoder une chaîne en UTF-8. J'ai essayé de nombreuses choses, y compris l'utilisation de string.encode('utf-8')
et unicode(string)
, mais j'obtiens l'erreur:
UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xef en position 1: l'ordinal n'est pas dans la plage (128)
Ceci est ma chaîne:
(。・ω・。)ノ
Je ne vois pas ce qui ne va pas, aucune idée?
Edit: Le problème est que l'impression de la chaîne telle quelle ne s'affiche pas correctement. En outre, cette erreur lorsque j'essaye de le convertir:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
Réponses:
Cela est dû au fait que l'encodage de votre terminal n'est pas réglé sur UTF-8. Voici mon terminal
Sur mon terminal, l'exemple fonctionne avec ce qui précède, mais si je supprime le
LANG
paramètre, cela ne fonctionnera pasConsultez la documentation de votre variante Linux pour découvrir comment rendre ce changement permanent.
la source
sudo apt-get install language-pack-de
ousudo locale-gen de_DE.UTF-8
(pour les paramètres régionaux allemands).LC_ALL
, et la valeur la plus simple qui la corrigerait estC.UTF-8
essayer:
Éditer:
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')
donneu'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, ce qui est correct.donc votre problème doit se trouver à un autre endroit, peut-être si vous essayez de faire quelque chose avec, il y a une conversion implicite en cours (peut-être imprimer, écrire dans un flux ...)
pour en dire plus, nous aurons besoin de voir du code.
la source
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
.string
est encodé en utf8. si vous l'imprimez, il connecte simplement les octets au flux de sortie, et si votre terminal ne l'interprète pas comme utf8, vous vous retrouvez avec des déchets. avecdecode
vous le convertissez en unicode, puis vous pouvezencode
à nouveau le convertir en un encodage que votre terminal comprend.Mon +1 au commentaire de mata sur https://stackoverflow.com/a/10561979/1346705 et à la démonstration de Nick Craig-Wood. Vous avez correctement décodé la chaîne. Le problème vient de la
print
commande car elle convertit la chaîne Unicode en codage de la console et la console n'est pas capable d'afficher la chaîne. Essayez d'écrire la chaîne dans un fichier et regardez le résultat en utilisant un éditeur décent qui prend en charge Unicode:Ensuite, vous verrez
(。・ω・。)ノ
.la source
Si vous travaillez sur un hôte distant , regardez
/etc/ssh/ssh_config
sur votre PC local .Lorsque ce fichier contient une ligne:
commentez-le en ajoutant
#
en tête de ligne. Cela pourrait aider.Avec cette ligne,
ssh
envoie les variables d'environnement liées à la langue de votre PC à l' hôte distant . Cela cause beaucoup de problèmes.la source
Essayez de définir le codage par défaut du système
utf-8
au début du script, de sorte que toutes les chaînes soient codées à l'aide de celui-ci.la source
C'est bien d'utiliser le code ci-dessous en haut de votre script comme l'a suggéré Andrei Krasutski .
Mais je vais vous suggérer d'ajouter également une
# -*- coding: utf-8 -*
ligne tout en haut du script.L'omettre jette une erreur ci-dessous dans mon cas lorsque j'essaie d'exécuter
basic.py
.Ce qui suit est le code présent dans
basic.py
lequel jette l'erreur ci-dessus.code avec erreur
Ensuite, j'ai ajouté la
# -*- coding: utf-8 -*-
ligne tout en haut et exécuté. Ça a marché.code sans erreur
Merci.
la source
#coding: utf-8
plutôt que# -*- coding: utf-8 -*-
cela est plus facile à retenir. Fonctionne directement avec Python PEP 263 - Définition des encodages de code source Python .Aucun problème avec mon terminal. Les réponses ci-dessus m'ont aidé à chercher dans la bonne direction, mais cela n'a pas fonctionné pour moi jusqu'à ce que j'ajoute
'ignore'
:Comme indiqué dans le commentaire ci-dessous, cela peut conduire à des résultats indésirables. OTOH, cela peut aussi faire assez bien l'affaire pour que les choses fonctionnent et vous ne vous souciez pas de perdre certains personnages.
la source
cela fonctionne pour ubuntu 15.10:
la source
Il semble que votre chaîne soit encodée
utf-8
, alors quel est exactement le problème? Ou qu'essayez-vous de faire ici ..?la source
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
quelle, je veux qu'elle l'encode correctement.Dans mon cas, cela a été causé par l'enregistrement de mon fichier Unicode avec une "BOM". Pour résoudre cela, j'ai ouvert le fichier en utilisant BBEdit et j'ai fait un "Enregistrer sous ..." en choisissant l'encodage "Unicode (UTF-8)" et non ce qu'il était livré avec qui était "Unicode (UTF-8, avec BOM) "
la source
J'obtenais le même type d'erreur et j'ai constaté que la console n'est pas capable d'afficher la chaîne dans une autre langue. Par conséquent, j'ai apporté les modifications de code ci-dessous pour définir default_charset comme UTF-8.
la source
C'est la meilleure réponse: https://stackoverflow.com/a/4027726/2159089
sous linux:
sys.stdout.encoding
est donc OK.la source
BOM, c'est si souvent BOM pour moi
vi le fichier, utilisez
et enregistrez-le. Cela le résout presque toujours dans mon cas
la source
J'ai eu la même erreur, avec des URL contenant des caractères non-ascii (octets avec des valeurs> 128)
Cela a fonctionné pour moi, en Python 2.7, je suppose que cette affectation a changé `` quelque chose '' dans la
str
représentation interne - c'est-à-dire qu'elle force le bon décodage de la séquence d'octets sauvegardéeurl
et met finalement la chaîne dans un utf-8str
avec toute la magie dans au bon endroit. Unicode en Python est pour moi de la magie noire. Espoir utilela source
je résous ce problème en changeant dans le fichier settings.py avec 'ENGINE': 'django.db.backends.mysql', n'utilisez pas 'ENGINE': 'mysql.connector.django',
la source
Convertissez simplement le texte explicitement en chaîne en utilisant
str()
. A travaillé pour moi.la source