2010-11-21 17 views
34

En una de mis máquinas tengo el error cuando estoy trabajando con el motor de aplicaciones de google o django.UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0xe0 en la posición 0: ordinal no en el rango (128)

Por ejemplo:

  • 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> 
    

mensaje de error:

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) 

Cuando estoy trabajando con archivos estáticos en Django (sin GAE) Tengo error muy similar (con diferente pila).

Me trataron de encontrar la razón del error y el código añadido a mimetypes.py:

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

en cuando me siento siguientes mensajes en mi consola:

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

en el Registro HKCR/MIME/Database/ContentType/I tiene cinco claves con letras rusas (cirílicas). ¿Pero cómo puedo solucionar este error?

+0

¿Cuál es el valor de "default_encoding"? En este momento parece que es algo que no se puede convertir en Cyrilic, con UTF-8 aquí probablemente debería corregir el error. –

+0

ascii. Intenté cambiarlo a utf-8, pero me aparece el error "UnicodeDecodeError: el códec 'utf8' no puede decodificar el byte 0xef en la posición 0: byte de continuación inválido". De todos modos, eliminé estas claves del registro y desapareció el error. – demas

+0

este es un error mimetype.py cambió el código de la pitón en esta url http://bugs.python.org/review/9291/diff/1663/Lib/mimetypes.py –

Respuesta

75

Esto es un error en mimetypes, desencadenado por datos incorrectos en el registro. (рєфшю/AMR no es en absoluto un tipo de medio MIME válido.)

ctype es un nombre clave de registro devuelto por _winreg.EnumKey, que mimetypes está esperando a ser una cadena Unicode, pero no lo es. A diferencia de _winreg.QueryValueEx, EnumKey devuelve una cadena de bytes (directamente de la versión ANSI de la API de Windows; _winreg en Python 2 no utiliza las interfaces Unicode aunque devuelve cadenas Unicode, por lo que nunca leerá caracteres que no pertenezcan a ANSI correctamente).

lo tanto, el intento de .encode falla con un Unicode Decode error tratando de obtener una cadena Unicode antes de codificarlo de nuevo a ASCII!

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

Estas líneas en mimetypes simplemente deben ser eliminados.

ETA: added to bug tracker.

+9

+1 para buscar y archivar un error –

+0

¡Gracias, esto solucionó mi problema con IPython en Anaconda v2.1! – gaborous

1

es un error de pitón con tiras MIME latinas en el registro iniciar regedit e inspeccionar "HKEY_CLASSES_ROOT \ MIME \ Database \ Content Type" para nombres no latinos.

8

Por cierto, el principal problema del problema es QuickTime, que agrega tipos distintos al del registro de Windows. La forma más fácil de solucionarlo es encontrar manualmente y eliminar del registro las subsecciones del HKCR/Mime/Database/ContentType/ comenzando con аудио/ y видео/.

Cuestiones relacionadas