BOM(byte order mark)

  • ファイルの先頭3バイトが ‘EF BB BF’ の UTF-8

rest_framework_csv

  • rendererで、 コンテキストの encoding を判定している
  • encodingutf-8-sig を 指定する

viewset: get_renderer_context をオーバーライドする

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    def get_renderer_context(self):
        """(override)"""
        context = super().get_renderer_context()
        # ここで、以下の条件の時に utf-8-sigにセット
        # 1) text/csv を求めている
        # 2) utf-8 でエンコードが指定されている(デフォルト)

        if self.request.META.get('HTTP_ACCEPT', '').startswith('text/csv'):
            context['encoding'] = 'utf-8-sig'

        return context

記事