web-dev-qa-db-fra.com

UnicodeEncodeError: il codec 'ascii' non può codificare il carattere in posizione 0: ordinal non compreso nell'intervallo (128)

Vous avez écrit le script Python, nous vous avons mis en garde de suite (9986 -), et il est toujours possible de télécharger le code de votre Mac, mais vous devez également vous assurer que tout va bien.

Il y a une interdiction si elle est présente au moins 10 secondes (10 bits) (Python 3.2.5 - OS X 10.4.11 iBook G4 PPC) et dont le code de la souris est parfait pour la version 13.10, mais une longue liste de questions est actuellement affichée:

Traceback (most recent call last):
  File "snippets-convert.py", line 352, in <module>
    main()
  File "snippets-convert.py", line 41, in main
    menu()
  File "snippets-convert.py", line 47, in menu
    print ("|\t ",snipper.decode(),"PySnipt'd",snipper.decode(),"\t|")
UnicodeEncodeError: 'ascii' codec can't encode character '\u2702' in position 0: ordinal not in range(128)

il n'y a pas de mots-clés:

print ("|\t ",chr(9986),"PySnipt'd",chr(9986),"\t|")

Question non résolue n'est-il pas la capacité de choisir quelqu'un? Vous avez donc besoin d'un système de contrôle, il y a peu de temps est l'unique système de contrôle utilisé. L'aspect du système opérationnel peut interférer avec le programme?

Ho letto queste domande:

Quelle est la cause de l'erreur? Dans le système d'exploitation, la version en Python est-elle qualifiée d'erreurs de programmation?

ÉDITER: interrogations erronées plus tard avec des problèmes dupliqués (ce qui est indiqué ci-dessus (tout ce qui a été dit ou modifié) :

Traceback (most recent call last):
  File "snippets-convert.py", line 353, in <module>
    main()
  File "snippets-convert.py", line 41, in main
    menu()
  File "snippets-convert.py", line 75, in menu
    main()
  File "snippets-convert.py", line 41, in main
    menu()
  File "snippets-convert.py", line 62, in menu
    search()
  File "snippets-convert.py", line 229, in search
    print_results(search_returned)      # Print the results for the user
  File "snippets-convert.py", line 287, in print_results
    getPath(toRead)                                             # Get the path for the snippet
  File "snippets-convert.py", line 324, in getPath
    snipXMLParse(path)
  File "snippets-convert.py", line 344, in snipXMLParse
    print (chr(164),child.text)
UnicodeEncodeError: 'ascii' codec can't encode character '\xa4' in position 0: ordinal not in range(128)

EDIT:

Entrer dans les images pour les personnes du terminal et afficher le support de la personne (voir les captures d'écran):

enter image description here

quand nous avons inséré une seule lettre cachée: \342\234\202 e quando premoEnterHo capito: -bash: ✂: command not found

EDIT Je suis arrivé @ J.F. Sebastian ha chiesto:

python3 test-io-encoding.py:

PYTHONIOENCODING:       None
locale(False):  US-ASCII
device(stdout): US-ASCII
stdout.encoding:        US-ASCII
device(stderr): US-ASCII
stderr.encoding:        US-ASCII
device(stdin):  US-ASCII
stdin.encoding: US-ASCII
locale(False):  US-ASCII
locale(True):   US-ASCII

python3 -S test-io-encoding.py:

PYTHONIOENCODING:       None
locale(False):  US-ASCII
device(stdout): US-ASCII
stdout.encoding:        US-ASCII
device(stderr): US-ASCII
stderr.encoding:        US-ASCII
device(stdin):  US-ASCII
stdin.encoding: US-ASCII
locale(False):  US-ASCII
locale(True):   US-ASCII

ÉDITER Comment fonctionne-t-il "hackerish"? fornita da @PauloBu:

Venez puoi vedere, poser une question à la défense (Yay!), Ma vie est une erreur. Traceback/errore:

+-=============================-+
✂Traceback (most recent call last):
  File "snippets-convert.py", line 357, in <module>
    main()
  File "snippets-convert.py", line 44, in main
    menu()
  File "snippets-convert.py", line 52, in menu
    print("|\t "+sys.stdout.buffer.write(chr(9986).encode('UTF-8'))+" PySnipt'd "+ sys.stdout.buffer.write(chr(9986).encode('UTF-8'))+" \t|")
TypeError: Can't convert 'int' object to str implicitly

ÉDITE Résultats de la discussion pour la discussion # PauloBu:

+-=============================-+
|
✂ PySnipt'd 
✂       |
+-=============================-+

EDIT:

E la sua correzione per la sua correzione:

+-=============================-+
✂✂|       PySnipt'd     |
+-=============================-+
29
RPiAwesomeness

Lorsque Python imprime et produit en sortie, il le code automatiquement sur le support cible. Si c'est un fichier, UTF-8 sera utilisé par défaut et tout le monde sera content, mais s'il s'agit d'un terminal, Python déterminera le codage utilisé par le terminal et tentera de coder la sortie à l'aide de celui-ci.

Cela signifie que si votre terminal utilise ascii comme encodage, Python tente d'encoder scissor char en ascii. Bien sûr, ascii ne le prend pas en charge, vous obtenez donc une erreur de décodage Unicode.

C'est pourquoi vous devez toujours coder explicitement votre sortie. Explicite vaut mieux qu'implicite Pour corriger votre code, vous pouvez faire:

import sys
sys.stdout.buffer.write(chr(9986).encode('utf8'))

Cela semble un peu hackerish. Vous pouvez également définir PYTHONIOENCODING = utf-8 avant d'exécuter le script. Je suis mal à l'aise avec les deux solutions. Probablement votre console ne supporte pas utf-8 et vous voyez du charabia. Mais votre programme se comportera correctement.

Ce que je vous recommande fortement si décidément avez besoin d'afficher une sortie correcte sur votre console est de configurer votre console pour utiliser un autre codage, qui prend en charge le caractère scissor. (utf-8 peut-être). Sur Linux, cela peut être réalisé en faisant: export lang=UTF_8. Sous Windows, vous modifiez la page de code de la console avec chcp. Il suffit de comprendre comment définir utf8 dans le vôtre et à mon humble avis, ce sera la meilleure solution.


Vous ne pouvez pas mélanger print et sys.stdout.write car ils sont fondamentalement les mêmes. En ce qui concerne votre code, la méthode hackerish serait la suivante:

sys.stdout.buffer.write(("|\t "+ chr(9986) +" PySnipt'd " + chr(9986)+" \t|").encode('utf8'))

Je vous suggère de lire dans la documentation pour voir ce qui se passe sous la hotte avec la fonction print et avec sys.stdout: http://docs.python.org/3/library/sys.html#sys.stdin

J'espère que cela t'aides!

20
Paulo Bu

test_io_encoding.py output suggère de modifier vos paramètres locale, par exemple, définissez LANG=en_US.UTF-8.


La première erreur peut être due au fait que vous essayez de décoder une chaîne qui est déjà Unicode. Python 2 tente de l'encoder en utilisant un encodage de caractères par défaut ('ascii') avant avant de le décoder en utilisant (éventuellement) un encodage de caractères différent. L'erreur se produit à l'étape encode:

>>> u"\u2702".decode() # Python 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2702' in position 0: ordinal not in range(128)

Il semble que vous exécutiez votre script en utilisant Python 2 au lieu de Python 3. Vous obtiendriez:

>>> "\u2702".decode() # Python 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'

erreur différente sinon.

Lâchez simplement l'appel .decode():

print("|\t {0} PySnipt'd {0} \t|".format(snipper))

Le deuxième problème est dû à l’impression d’une chaîne Unicode dans un tube:

$ python3 -c'print("\u2702")'
✂
$ python3 -c'print("\u2702")' | cat
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\u2702' in position 0: ordinal not in range(128)

Définissez la variable d’environnement PYTHONIOENCODING appropriée:

$ PYTHONIOENCODING=utf-8 python3 -c'print("\u2702")' | cat
✂

le terminal affiche simplement ceci: | b'\xe2\x9c\x82' PySnipt'd b'\xe2\x9c\x82' |

Si snipper est un objet bytes, laissez les appels snipper.decode()

$ python3 -c"print(b'\xe2\x9c\x82'.decode())"
✂
$ python3 -c"print(b'\xe2\x9c\x82'.decode())" | cat
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\u2702' in position 0: ordinal not in range(128)

Le correctif est le même:

$ PYTHONIOENCODING=utf-8 python3 -c"print(b'\xe2\x9c\x82'.decode())" | cat
✂
14
jfs

Mes paramètres régionaux sont définis sur de_AT.UTF-8 mais ces lignes dans /etc/profile.__ étaient manquantes:

export LANG=de_AT.UTF-8
export LANGUAGE=de_AT.UTF-8
export LC_ALL=de_AT.UTF-8

déconnexion/connexion et votre problème devrait être résolu

Pour vérifier si tous les paramètres régionaux sont définis correctement, saisissez locale dans votre terminal.

Le résultat devrait ressembler à ceci:

LANG=de_AT.UTF-8
LANGUAGE=de_AT.UTF-8
LC_CTYPE="de_AT.UTF-8"
LC_NUMERIC="de_AT.UTF-8"
LC_TIME="de_AT.UTF-8"
LC_COLLATE="de_AT.UTF-8"
LC_MONETARY="de_AT.UTF-8"
LC_MESSAGES="de_AT.UTF-8"
LC_PAPER="de_AT.UTF-8"
LC_NAME="de_AT.UTF-8"
LC_ADDRESS="de_AT.UTF-8"
LC_TELEPHONE="de_AT.UTF-8"
LC_MEASUREMENT="de_AT.UTF-8"
LC_IDENTIFICATION="de_AT.UTF-8"
LC_ALL=de_AT.UTF-8
0
Mike Mitterer