使用来自django的BOM返回以UTF-8编码的csv

hak*_*aki 5 csv django utf-8

我正在尝试输出用户可以使用excel打开的CSV文件.我用UTF-8编写了所有字符串,但是当我用excel打开文件时,我看到了jibrish.只有在使用BOM将文件转换为UTF-8(在Windows上使用notepad ++)之后,我才能正确显示内容.

我正在遵循文档中的这种模式:

def render_to_csv(self, request, qs): 
  response = HttpResponse(content_type='text/csv')
  response['Content-Disposition'] = 'attachment; filename="test.csv"'

  writer = csv.writer(response, delimiter=',')

  for row in qs.values_list(*self.fields_to_export):
    writer.writerow([unicode(v).encode('utf-8') if v is not None else '' for v in row])

  return response
Run Code Online (Sandbox Code Playgroud)

BOM在哪里适用于所有这些?

顺便说一句,在SO上也有类似的问题,但不幸的是,他们没有回答.

编辑

在@Alastair McCormack的基础上,我最终明确地在文件的开头添加了BOM字符.唯一的区别是我使用了编解码器包而不是硬编码字节.感觉很尴尬但是诀窍!

import codecs

def render_to_csv(self, request, qs): 
  ... 
  response.write(codecs.BOM_UTF8)
  ...
  return response
Run Code Online (Sandbox Code Playgroud)

Ala*_*ack 5

在编写数据之前,将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=',')
  …
Run Code Online (Sandbox Code Playgroud)

  • 不适用于 Python 3。`response.write(codecs.BOM_UTF8)` 将适用于 py2 和 py3。 (3认同)
  • 您将如何使用``StreamingHttpResponse``来做到这一点? (2认同)