Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从django返回以UTF-8编码的csv和BOM_Django_Csv_Utf 8 - Fatal编程技术网

从django返回以UTF-8编码的csv和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字符。唯一的区别是我使用了编解码器包,而不是硬编码字节。感

我正在尝试输出一个用户可以用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 3
response.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)