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)
請發表一個'repr(img_file.filename)',這樣我們可以在你的上下文中創建相同的bytearray –
@PaoloCasciello,'repr(img_file.filename)'返回這個'u'W \ xc3 \ xbcrfel.jpg'' –