web-dev-qa-db-fra.com

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 l'une de mes machines, j'ai l'erreur lorsque je travaille avec le moteur d'applications Google 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 une erreur très similaire (avec une pile différente).

J'ai essayé de trouver la raison de l'erreur et j'ai ajouté du code à mimetypes.py:

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

Ensuite, je reçois les prochains messages dans ma console:

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

Dans le registre HKCR/Mime/Database/ContentType/j'ai cinq clés avec des lettres russes (cyriliques). Mais comment puis-je corriger cette erreur?

34
demas

Il s'agit d'un bogue dans mimetypes, déclenché par de mauvaises données dans le registre. (рєфшю/AMR n'est pas du tout un type de média MIME valide.)

ctype est un nom de clé de registre renvoyé par _winreg.EnumKey, qui mimetypes s'attend à être une chaîne Unicode, mais ce n'est pas le cas. Contrairement à _winreg.QueryValueEx, EnumKey renvoie une chaîne d'octets (directement à partir de la version ANSI de l'API Windows; _winreg in Python 2 n'utilise pas les interfaces Unicode même s'il renvoie des chaînes Unicode, donc il ne lira jamais correctement les caractères non ANSI).

Donc, la tentative de .encode il échoue avec un décodage Unicode Erreur lors de la tentative d'obtention d'une chaîne Unicode avant de la recoder en ASCII!

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

Ces lignes dans mimetypes doivent simplement être supprimées.

ETA: ajouté au bug tracker .

75
bobince

Soit dit en passant, le principal responsable du problème est QuickTime qui ajoute des types de mime non ascii au registre Windows. Le moyen le plus simple de le corriger est de rechercher et de supprimer manuellement du registre les sous-sections du HKCR/Mime/Database/ContentType/ commençant par аудио/ et видео/.

8
newtover

Il y a un patch:

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

Fonctionne très bien pour moi.

Il suffit de remplacer UnicodeEncodeError pour être UnicodeError

5
Wangsu

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

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

import sys
sys.setdefaultencoding("cp1251")
4
HaveF

son bogue python avec des pointes MIME latines dans le registre démarre regedit et inspecte "HKEY_CLASSES_ROOT\MIME\Database\Content Type" pour les noms non latins.

1
Codeboy.ru