2013-08-17 1 views
0
Python Header:  # ! /usr/bin/env python 
        # -*- coding: utf-8 -*- 
        # image_upload.py 

Cherrypy Config: cherrypy.config.update(
         {'tools.encode.on': True, 
         'tools.encode.encoding': 'utf-8', 
         'tools.decode.on': True, 
         },) 

HTML Header:  <head><meta http-equiv="Content-Type" 
        content="text/html;charset=ISO-8859-1"></head> 

""" Python  2.7.3 
    Cherrypy  3.2.2 
    Ubuntu  12.04 
""" 

С формой HTML я загружаю файл изображения в базу данных. Это работает до сих пор без проблем. Однако, если имя файла не равно 100% в ASCII, похоже, нет способа получить его в UTF-8. Это странно, потому что с полями ввода текста HTML он работает без проблем, от сохранения до показа. Поэтому я предполагаю, что это проблема с кодировкой или декодированием с картой веб-приложений CherryPy, потому что загрузка связана с ней, like here.Python ─ UTF-8 filename из HTML-формы через CherryPy

Как это работает:
HTML-формы Посылает загруженный файл в другую функцию Python, который принимает файл в стандартном словаре **kwargs. Отсюда вы получите имя файла с расширением, например: filename = kwargs['file'].filename. Но это уже с неправильной кодировкой. До сих пор изображение не обрабатывалось, не хранилось и не использовалось каким-либо образом.

Я прошу решение, которое предотвратит его, просто проанализировать имя файла и изменить его «вручную». Я думаю, что результат уже есть в UTF-8, что делает его громоздким, чтобы понять это правильно. Вот почему заставить CherryPy сделать это, может быть, лучший способ. Но, возможно, это даже проблема с HTML, потому что файл поступает из формы.

Это неправильные декодированные умляуты.
Мне нужен вход в качестве результата.

input → result  input → result 
    ä → ä   Ä → Ä 
    ö → ö   Ö → Ö 
    ü → ü   Ü → Ãœ 

Ниже приведены неудачные попытки получить правильный результат, который был бы: "Würfel"
ПРИМЕЧАНИЕ: img_file = kwargs['file']


  • оригинальная попытка:

    result = img_file.filename.rsplit('.',1)[0] 
    

    результат: "Würfel"


  • кодирование Система изменения:

    reload(sys) 
    sys.setdefaultencoding('utf-8') 
    

    Результат: "Würfel"


  • кодировании ttempt 1:

    result = img_file.filename.rsplit('.',1)[0].encode('utf-8') 
    

    результат: "Würfel"


  • кодирования попытка 2:

    result = unicode(img_file.filename.rsplit('.',1)[0], 'urf-8') 
    

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

    TypeError: decoding Unicode is not supported 
    

  • декодирования попытка:

    result = img_file.filename.rsplit('.',1)[0].decode('utf-8') 
    

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

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128) 
    

  • литая попытка:

    result = str(img_file.filename.rsplit('.',1)[0]) 
    

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

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128) 
    

+0

, пожалуйста, напишите 'repr (img_file.filename)', поэтому мы можем создать тот же bytearray в вашем контексте –

+0

@PaoloCasciello, 'repr (img_file.filename)' возвратил это 'u'W \ xc3 \ xbcrfel.jpg'' –

ответ

0

Попытка с вашей строкой, кажется, я могу получить имя файла, используя кодировку latin1.

>>> s = u'W\xc3\xbcrfel.jpg' 
>>> print s.encode('latin1') 
Würfel.jpg 
>>> 

Вам просто нужно использовать эту .encode('latin1') перед разбиением. Но проблема здесь шире. Вам действительно нужно выяснить, почему ваша веб-кодировка составляет latin1 вместо utf8. Я не знаю cherrypy, но стараюсь использовать utf8, или вы можете попасть в другие глюки при обслуживании своего приложения через веб-сервер, например apache или nginx.

+0

Спасибо. На данный момент это нужно сделать. Когда я найду реальное решение с CherryPy, я опубликую его в редактировании. –

1

Проблема заключается в том, что вы служите ваш HTML с кодировкой ISO-8859-1; это делает браузеры путаными, и они используют кодировку также при отправке на сервер. Слушайте весь свой HTML всегда с UTF-8, код в UTF-8 и установите свой терминал в UTF-8, и у вас не должно быть проблем.

+0

Спасибо за подсказку. Я добавил метатег в качестве попытки решения этой проблемы. Я смутил UTF/8 с ISO-8859-1, поэтому я бы не подумал, что это проблема. –

+0

Вы должны подавать с Content-Type: text/html; charset = UTF-8, и везде постоянно говорят, что ваша кодировка - UTF-8; ubuntu использует UTF-8 всюду. –

+0

Итак, когда моя страница будет использоваться из разных систем, возможно, я должен оставить это в коде: reload (sys) sys.setdefaultencoding ('utf-8') –