Flask 在 send_file 时的 UnicodeEncodeError

最近在使用flask时遇到了一个问题:

@app.route('/getfile/<timestamp>/<filename>')
def download(timestamp, filename):
    dirpath = os.path.join(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'upload'), timestamp)
    return send_from_directory(dirpath, filename, as_attachment=True)

在本机创建 upload/1512026299/%E6%97%A0%E6%A0%87%E9%A2%98.png 后,运行上方代码。在访问 /getfile/1512026299/%E6%97%A0%E6%A0%87%E9%A2%98.png 时,会抛出下面的异常:

127.0.0.1 - - [30/Nov/2017 21:39:05] "GET /getfile/1512026299/%E6%97%A0%E6%A0%87%E9%A2%98.png HTTP/1.1" 200 -
Error on request:
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\werkzeug\serving.py", line 209, in run_wsgi
execute(self.server.app)
File "C:\Program Files\Python36\lib\site-packages\werkzeug\serving.py", line 200, in execute
write(data)
File "C:\Program Files\Python36\lib\site-packages\werkzeug\serving.py", line 168, in write
self.send_header(key, value)
File "C:\Program Files\Python36\lib\http\server.py", line 508, in send_header
("%s: %s\r\n" % (keyword, value)).encode('latin-1', 'strict'))
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 43-45: ordinal not in range(256)

尝试解决无果,于是贴到了 StackOverflow 上寻求解决方案,结果发现这是flask自身的坑……

flask在send_file时(由send_from_directory调用),如果使用as_attachement=True,就会将文件名放到header里。然后flask还不支持使用unicode方式编码URL,于是就出现了这个问题。

这个问题在GitHub上已经有人修复并请求merge了,应该不久后就能解决。如果真的急用,还是有临时解决方案的,详细的可以点进上方链接(https://stackoverflow.com/questions/47575665/flask-raises-unicodeencodeerror-latin-1-when-send-attachment-with-utf-8-charac/47577423)中查看。

转载于:https://www.cnblogs.com/gresstant/p/7943056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 出现此错误是因为在将数据导出到CSV文件,使用的编码格式不支持某些特殊字符。在默认情况下,to_csv函数会尝试使用GBK编码格式来保存数据,但是存在一些无法通过此编码格式表示的字符,导致出现UnicodeEncodeError错误。 要解决这个问题,可以采取以下几种方法之一: 1. 更改编码格式:尝试使用其他编码格式,如UTF-8或UTF-16进行保存。可以在to_csv函数中添加encoding参数并将其设置为"utf-8"或"utf-16",以将数据以UTF-8或UTF-16编码格式保存到CSV文件中。 2. 忽略无法编码的字符:如果你不关心无法编码的字符,可以在to_csv函数中添加errors参数,将其设置为"ignore",以忽略无法编码的字符并成功保存其他有效数据。 3. 替换无法编码的字符:可以尝试使用replace方法替换无法编码的字符。在调用to_csv函数之前,使用字符串的replace方法将无法编码的字符替换为其他字符,以避免出现编码错误。 综上所述,通过更改编码格式、忽略无法编码的字符或替换无法编码的字符,可以解决to_csv函数出现UnicodeEncodeError的问题。 ### 回答2: 出现"UnicodeEncodeError: 'gbk' codec can't encode character '\xCB' in position" 这个错误主要是因为使用的编码格式(gbk)无法处理给定字符串中包含的特殊字符。 对于这个问题,产生这个错误的原因可能有以下几种解决办法: 1. 更换编码格式:可以尝试更换为兼容特殊字符的编码格式,如使用UTF-8编码格式,可以将代码中的'GBK'替换为'UTF-8'。 2. 删除特殊字符:在出现错误的字符串中,删除特殊字符或将其替换为空字符。可以使用内置的字符串处理函数,例如replace()函数,将特殊字符替换为空字符。 3. 忽略错误字符:在打开文件,可以使用errors参数来忽略不能编码的字符,避免出现错误。例如:`open(file, encoding='gbk', errors='ignore')`。这样会忽略掉无法编码的字符,继续处理其他字符。 4. 根据需要转义字符:对于一些无法忽略的特殊字符,可以考虑转义该字符。例如,使用unicode-escape编码格式来保存数据,这样特殊字符会被转义,而不会引发错误。 总之,根据具体的情况选择适当的解决方法,并确保选择的编码格式能够处理特殊字符,从而避免Unicode编码错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值