2010-11-21 5 views
34

На одной из моих машин у меня есть ошибка, когда я работаю с движком google apps или django.UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xe0 в позиции 0: порядковый не в диапазоне (128)

Например:

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

сообщение об ошибке:

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) 

Когда я работаю со статическими файлами в Джанго (без GAE) У меня очень похожая ошибка (с разным стеком).

Я пытался найти причину ошибки и добавлен код mimetypes.py:

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

Тогда я получаю следующие сообщения в моей консоли:

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

в реестре HKCR/Пантомима/База данных/ContentType/У меня есть пять ключей с русскими (кириллическими) буквами. Но как я могу исправить эту ошибку?

+0

Что такое значение «default_encoding», сейчас кажется, что это что-то, что не может преобразовать cyrilic, используя UTF-8 здесь, вероятно, следует исправить ошибку. –

+0

ascii. Я попытался изменить его на utf-8, но я получаю ошибку «UnicodeDecodeError:« utf8 »кодек не может декодировать байт 0xef в позиции 0: недопустимый байт продолжения». Во всяком случае, я удаляю эти ключи из реестра, и ошибка исчезает. – demas

+0

это ошибка mimetype.py изменил код python по этому URL-адресу http://bugs.python.org/review/9291/diff/1663/Lib/mimetypes.py – 2014-01-17 06:41:56

ответ

75

Это ошибка в mimetypes, вызванная плохими данными в реестре. (рєфшю/AMR вовсе не допустимый тип MIME медиа.)

ctype является имя ключа реестра возвращаемый _winreg.EnumKey, который mimetypes ожидает быть строкой Unicode, но это не так. В отличие от _winreg.QueryValueEx, EnumKey возвращает байтовую строку (прямо из ANSI-версии Windows API; _winreg в Python 2 не использует интерфейсы Unicode, даже если возвращает строки Unicode, поэтому он никогда не будет читать символы, отличные от ANSI).

Таким образом, попытка .encode не работает с Unicode Декодирование Ошибка при попытке получить строку Unicode перед ее кодировкой обратно в ASCII!

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

Эти линии в mimetypes просто должны быть удалены.

ETA: added to bug tracker.

+9

+1 для прокопа и регистрации ошибки –

+0

Спасибо, это исправило мою проблему с IPython на Anaconda v2.1! – gaborous

1

его ошибка python с латинскими подсказками MIME в реестре Запустите regedit и проверьте «HKEY_CLASSES_ROOT \ MIME \ Database \ Content Type» для нелатинских имен.

8

К слову, основной проблемой является QuickTime, которая добавляет типы не-ascii-mime в реестр Windows. Самый простой способ исправить это - вручную найти и удалить из реестра подразделы HKCR/Mime/Database/ContentType/, начиная с аудио/ и видео/.

5

Существует патч:

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

Работает отлично подходит для меня.

Просто замените UnicodeEncodeError быть UnicodeError

+0

Принятый ответ сработал, я не пробовал этот, но я думаю, что он тоже сработает. – shellbye

Смежные вопросы

 Смежные вопросы