2013-08-17 27 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表單,我將圖像文件上載到數據庫。這工作到目前爲止沒有問題。但是,如果文件名不是ASCII碼的100%,那麼似乎無法以UTF-8檢索它。這很奇怪,因爲使用HTML文本輸入字段可以毫無問題地工作,從保存到顯示。因此,我認爲這是一個Web應用程序框架CherryPy的編碼或解碼問題,因爲上傳是由它所支持的,like here通過CherryPy從HTML表格獲得的Python─UTF-8文件名

工作原理:
HTML表單將上傳的文件POST到另一個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') –