StringIO生成的包含BOM的csv文件

问题描述:

我试图生成一个在Excel中正确打开但使用StringIO而不是文件的CSV。StringIO生成的包含BOM的csv文件

output = StringIO("\xef\xbb\xbf") # Tried just writing a BOM here, didn't work 
    fieldnames = ['id', 'value'] 
    writer = csv.DictWriter(output, fieldnames, dialect='excel') 
    writer.writeheader() 
    for d in Data.objects.all(): 
     writer.writerow({ 
      'id': d.id, 
      'value': d.value 
     }) 
    response = HttpResponse(output.getvalue(), content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename=data.csv') 
    return response 

这是一个Django视图的一部分,所以我真的不想进入倾出临时文件此业务。

我也试过如下:

response = HttpResponse(output.getvalue().encode('utf-8').decode('utf-8-sig'), content_type='text/csv') 

没有运气

我能做些什么,以获得utf-8-sig正确编码输出文件,以BOM,使Excel将打开文件并正确显示多字节Unicode字符?

HttpResponse接受bytes

output = StringIO() 
... 
response = HttpResponse(output.getvalue().encode('utf-8-sig'), content_type='text/csv') 

,或者让Django的做编码:

response = HttpResponse(output.getvalue(), content_type='text/csv; charset=utf-8-sig')