diff --git a/apps/common/parsers/csv.py b/apps/common/parsers/csv.py index 4cd626cef8d5..d96e9d2ef2a4 100644 --- a/apps/common/parsers/csv.py +++ b/apps/common/parsers/csv.py @@ -3,6 +3,7 @@ import json import chardet +import codecs import unicodecsv from rest_framework.parsers import BaseParser @@ -82,6 +83,7 @@ def parse(self, stream, media_type=None, parser_context=None): try: stream_data = stream.read() + stream_data = stream_data.strip(codecs.BOM_UTF8) detect_result = chardet.detect(stream_data) encoding = detect_result.get("encoding", "utf-8") binary = self._universal_newlines(stream_data) diff --git a/apps/common/renders/csv.py b/apps/common/renders/csv.py index 7e57a97e189e..f917edd4c64b 100644 --- a/apps/common/renders/csv.py +++ b/apps/common/renders/csv.py @@ -2,6 +2,7 @@ # import unicodecsv +import codecs from datetime import datetime from six import BytesIO @@ -73,7 +74,8 @@ def render(self, data, media_type=None, renderer_context=None): table = self._gen_table(data, header, labels) csv_buffer = BytesIO() - csv_writer = unicodecsv.writer(csv_buffer, encoding='utf-8-sig') + csv_buffer.write(codecs.BOM_UTF8) + csv_writer = unicodecsv.writer(csv_buffer, encoding='utf-8') for row in table: csv_writer.writerow(row)