When using #django to send
content-disposition: attachment responses, you MUST explicitly set the response encoding (charset) otherwise windows will assume the response is in whatever-weird-encoding-windows-uses, rather than UTF-8 (you are using UTF-8, aren’t you?).
CSV example code:
response = HttpResponse(utf_8_encoded_csv_text, status=200, mimetype="text/csv; charset=utf-8") response['Content-Disposition'] = 'attachment; filename=data.csv'
It seems that some weird old applications like SPSS need a BOM in there as well, even though UTF-8 doesn’t have a BOM. Add that like this
response.content = '\xef\xbb\xbf' + response.content
before sending the response