从django返回以UTF-8编码的csv和BOM
我正在尝试输出一个用户可以用excel打开的CSV文件。我已经用UTF-8编码了所有字符串,但是当我用excel打开文件时,我看到了jibrish。只有在将文件转换为带有BOM的UTF-8(在windows上使用记事本+)之后,我才能正确显示内容 我遵循以下模式: 在这一切中,物料清单应该放在哪里 顺便说一句,有这么多,但不幸的是,没有人得到答复 编辑 在@Alastair McCormack的基础上,我最终在文件的开头显式地添加了BOM字符。唯一的区别是我使用了编解码器包,而不是硬编码字节。感觉很尴尬,但却能成功从django返回以UTF-8编码的csv和BOM,django,csv,utf-8,Django,Csv,Utf 8,我正在尝试输出一个用户可以用excel打开的CSV文件。我已经用UTF-8编码了所有字符串,但是当我用excel打开文件时,我看到了jibrish。只有在将文件转换为带有BOM的UTF-8(在windows上使用记事本+)之后,我才能正确显示内容 我遵循以下模式: 在这一切中,物料清单应该放在哪里 顺便说一句,有这么多,但不幸的是,没有人得到答复 编辑 在@Alastair McCormack的基础上,我最终在文件的开头显式地添加了BOM字符。唯一的区别是我使用了编解码器包,而不是硬编码字节。感
import codecs
def render_to_csv(self, request, qs):
...
response.write(codecs.BOM_UTF8)
...
return response
在写入数据之前,将UTF-8 BOM添加到响应对象:
def render_to_csv(self, request, qs):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="test.csv"'
# BOM
response.write("\xEF\xBB\xBF")
writer = csv.writer(response, delimiter=',')
…
StreamingHttpResponse
用于csv
添加UTF-8 BOM或\xEF\xBB\xBF
从官方修改
给出的答案很好,但我想给出一个提示,如何通过仅更改一行来使用流开头的UTF-8 BOM字节序列:
import itertools
import codecs
streaming_content = itertools.chain([codecs.BOM_UTF8], (writer.writerow(row) for row in rows))
response = StreamingHttpResponse(streaming_content, content_type="text/csv")
在我的例子中,当作为http响应返回时,第一个BOM_UTF8字符会自动删除。所以我不得不手动添加两个BOM_UTF8字符
response.write(codecs.BOM_UTF8)
response.write(codecs.BOM_UTF8)
response.write(encoded_csv_content)
我不知道这是什么原因,但可能会对某些人有所帮助,或者一些知道原因的人可能会在评论中解释。使用
StreamingHttpResponse
,您将如何做到这一点?不适用于Python 3response.write(codecs.BOM\u UTF8)
将同时适用于py2和py3.0。这是因为codecs.BOM_UTF8
在Py3中返回一个字节字符串。我不久前遇到了同样的问题,在这里问了一个问题,然后得到了这个答案:这让我找到了相同的“解决方案”。。。
import itertools
import codecs
streaming_content = itertools.chain([codecs.BOM_UTF8], (writer.writerow(row) for row in rows))
response = StreamingHttpResponse(streaming_content, content_type="text/csv")
response.write(codecs.BOM_UTF8)
response.write(codecs.BOM_UTF8)
response.write(encoded_csv_content)