34 votes

UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xe0 en position 0: l'ordinal n'est pas dans la plage (128)

Sur une de mes machines, j'ai le message d'erreur quand je travaille avec google apps engine ou django.

Par exemple:

  • app.yaml

    application: demas1252c
    version: 1
    runtime: python
    api_version: 1
    
    
    handlers:
       - url: /images
    static_dir: images
       - url: /css
    static_dir: css
       - url: /js
    static_dir: js
       - url: /.*
    script: demas1252c.py
    
  • demas1252c.py

    import cgi
    import wsgiref.handlers
    
    
    from google.appengine.ext.webapp import template
    from google.appengine.ext import webapp
    
    
    class MainPage(webapp.RequestHandler): 
    def get(self):
    values = {'id' : 10}
    
    
    self.response.out.write(template.render('foto.html', values))
    
    
    application = webapp.WSGIApplication([('/', MainPage)], debug = True)
    wsgiref.handlers.CGIHandler().run(application)
    
  • foto.html

    <!DOCTYPE html>
    <html lang="en">
        <head></head>
    <body>some</body>
    </html>
    

message d'erreur:

C:\artefacts\dev\project>"c:\Program Files\Google\google_appengine\dev_appserver.py" foto-hosting
Traceback (most recent call last):
  File "c:\Program Files\Google\google_appengine\dev_appserver.py", line 69, in <module>
    run_file(__file__, globals())
  File "c:\Program Files\Google\google_appengine\dev_appserver.py", line 65, in run_file
    execfile(script_path, globals_)
  File "c:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_main.py", line 92, in <module>
    from google.appengine.tools import dev_appserver
  File "c:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 140, in <module>
    mimetypes.add_type(mime_type, '.' + ext)
  File "C:\Python27\lib\mimetypes.py", line 344, in add_type
    init()
  File "C:\Python27\lib\mimetypes.py", line 355, in init
    db.read_windows_registry()
  File "C:\Python27\lib\mimetypes.py", line 260, in read_windows_registry
    for ctype in enum_types(mimedb):
  File "C:\Python27\lib\mimetypes.py", line 250, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)

Lorsque je travaille avec des fichiers statiques dans django (sans gae) j'ai très similaire d'erreur (avec différents pile).

J'ai essayé de trouver la raison de l'erreur et l'ajout d'un code de mimetypes.py:

print '====='
print ctype
ctype = ctype.encode(default_encoding) # omit in 3.x!

Puis-je obtenir prochains messages dans ma console:

=====
video/x-ms-wvx
=====
video/x-msvideo
=====
рєфшю/AMR
Traceback (most recent call last):

Dans le registre HKCR/Mime/Base de données/ContentType/ j'ai cinq touches avec la russie (cyrilic) des lettres. Mais comment puis-je corriger cette erreur?

75voto

bobince Points 270740

C'est un bug en mimetypes, déclenchées par les données erronées dans le registre. (рєфшю/AMR n'est pas valide, type MIME.)

ctype est un nom de clé de registre retourné par _winreg.EnumKeyqui mimetypes s'attend à une chaîne Unicode, mais il ne l'est pas. Contrairement aux _winreg.QueryValueEx, EnumKey retourne une chaîne d'octets (direct depuis la version ANSI de l'API Windows; _winreg en Python 2 ne pas utiliser l'Unicode des interfaces, même si elle renvoie des chaînes Unicode, donc ça va jamais lire des caractères non ANSI correctement).

Si la tentative d' .encode il échoue avec une UnicodeDécoderErreur en essayant d'obtenir une chaîne Unicode avant l'encodage de retour à l'ASCII!

try:
    ctype = ctype.encode(default_encoding) # omit in 3.x!
except UnicodeEncodeError:
    pass

Ces lignes en mimetypes devraient être purement et simplement supprimé.

ETA: ajouté le bug tracker.

8voto

newtover Points 12301

En passant, QuickTime constitue le principal problème du problème. Il ajoute des types mime non ascii au registre Windows. Le moyen le plus simple de résoudre ce problème consiste à rechercher et à supprimer manuellement du registre les sous-sections des HKCR/Mime/Database/ContentType/ commençant par аудио/ et видео/ .

5voto

Wangsu Points 61

Il y a un patch:

http://bugs.python.org/file18143/9291.patch

Ça marche bien pour moi.

Il suffit de remplacer UnicodeEncodeError pour être UnicodeError

4voto

HaveF Points 586

Une solution alternative de python issue9291 par Alexandr Zarubkin (me21) :

Ajoutez le fichier nommé sitecustomize.py dans le dossier Lib \ site-packages.

 import sys
sys.setdefaultencoding("cp1251")
 

1voto

Codeboy.ru Points 31

c’est un bogue python avec des astuces MIME latines dans le registre, démarrez regedit et inspectez "HKEY_CLASSES_ROOT \ MIME \ Database \ Content Type" pour rechercher des noms non latins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X