【发布时间】:2013-08-17 13:45:02
【问题描述】:
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。
它是如何工作的:
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”
-
编码尝试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),以便我们可以在您的上下文中创建相同的字节数组 -
@PaoloCasciello,
repr(img_file.filename)回复了这个u'W\xc3\xbcrfel.jpg'
标签: python html encoding utf-8 cherrypy