2010-11-21 11 views
34

Auf einer meiner Maschinen habe ich den Fehler, wenn ich mit google apps engine oder django arbeite.UnicodeDecodeError: 'Ascii' Codec kann Byte 0xe0 in Position 0 nicht dekodieren: Ordnungszahl nicht im Bereich (128)

Zum Beispiel:

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

Fehlermeldung:

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) 

Wenn ich mit statischen Dateien in django (ohne gae) arbeite ich sehr ähnliche Fehler (mit unterschiedlichen Stack).

Ich habe versucht, den Grund des Fehlers zu finden und den Code mimetypes.py hinzugefügt:

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

Dann bekomme ich in meiner Konsole nächsten Nachrichten:

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

in der Registrierung HKCR/Mime/Database/ContentType/Ich habe fünf Schlüssel mit russischen (cyrilic) Buchstaben. Aber wie kann ich diesen Fehler beheben?

+0

Was ist der Wert von "default_encoding", im Moment scheint es, dass es etwas ist, das nicht cyrilic konvertieren kann, UTF-8 hier sollte wahrscheinlich den Fehler beheben. –

+0

ascii. Ich habe versucht, es in utf-8 zu ändern, aber ich bekomme Fehler "UnicodeDecodeError: 'utf8' Codec kann Byte 0xef in Position 0 nicht dekodieren: ungültiges Fortsetzungsbyte". Wie auch immer, ich entferne diese Schlüssel aus der Registrierung und der Fehler ist verschwunden. – demas

+0

Dies ist ein Fehler mimetype.py änderte den Python-Code an dieser URL http://bugs.python.org/review/9291/diff/1663/Lib/mimetypes.py –

Antwort

75

Dies ist ein Fehler in mimetypes, ausgelöst durch ungültige Daten in der Registrierung. (рєфшю/AMR ist nicht ein gültigen MIME-Medientypen.)

ctype ist ein Registrierungsschlüssel Name von _winreg.EnumKey zurückgegeben, die mimetypes erwartet wird ein Unicode-String zu sein, ist es aber nicht. Im Gegensatz zu _winreg.QueryValueEx gibt EnumKey eine Bytezeichenfolge zurück (direkt von der ANSI-Version der Windows-API; _winreg in Python 2 verwendet die Unicode-Schnittstellen nicht, obwohl Unicode-Zeichenfolgen zurückgegeben werden. Daher werden keine Nicht-ANSI-Zeichen korrekt gelesen).

So der Versuch, .encode schlägt es mit einem Unicode Decode Fehler beim Versuch, eine Unicode-Zeichenfolge vor der Codierung wieder in ASCII zu erhalten!

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

Diese Linien in mimetypes einfach entfernt werden sollen.

ETA: added to bug tracker.

+9

+1 für das Graben und die Einreichung eines Bugs –

+0

Danke, das hat mein Problem mit IPython auf Anaconda v2.1 behoben! – gaborous

1

Es ist ein Python-Fehler mit lateinischen MIME-Tipes in der Registrierung Regedit starten und "HKEY_CLASSES_ROOT \ MIME \ Database \ Content Type" für nicht-lateinische Namen zu inspizieren.

8

Übrigens, das Hauptproblem des Problems ist QuickTime, das der Windows-Registrierung Nicht-ASCII-MIME-Typen hinzufügt. Der einfachste Weg, dies zu beheben, ist das manuelle Finden und Entfernen der Unterabschnitte der HKCR/Mime/Database/ContentType/ beginnend mit аудио/ und видео/ aus der Registrierung.

Verwandte Themen