ダウンロードするファイルの文字コードを動的に変更


press
ダウンロードするファイルの文字コードを動的に変更

ダウンロードするファイルの文字コードを動的に変更

ウェブアプリケーションの中でCSVやテキストファイルをダウンロードさせた時に文字化けが発生する事があります。使用する文字コードが決まっていれば予め固定してしまう事で文字化けは防げますが、端末やOSが異なる環境で不特定多数が利用する場合にはクライアントに合わせて動的に文字コードを変更する必要があります。その際にクライアントのUserAgentからOSやブラウザ環境を取得して適切な文字コードでダウンロードさせる方法です。

UserAgentからOSやブラウザ環境を取得

Djangoでは以下のコードでクライアントのUserAgentが取得できます。

user_agent = request.META['HTTP_USER_AGENT']

取得したクライアントのUserAgentを表示してみると以下の様にクライアントのOSやヴァージョン、ブラウザの種類などが取得できています

Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15

動的に文字コードを変換

def file_charset(request):
    user_agent = request.META['HTTP_USER_AGENT']
    if 'Windows' in user_agent:
        response = HttpResponse(content_type='text/csv; charset=Shift-JIS')
    else:
        response = HttpResponse(content_type='text/csv;')

    response['Content-Disposition'] = 'attachment; filename="{}"'.format(urllib.parse.quote(file_name))

    df.to_csv(path_or_buf=response, sep=',', float_format='%.2f', index=True, decimal=",")

    return response

user_agent = request.META['HTTP_USER_AGENT']
クライアントのUserAgentを取得します。

if 'Windows' in user_agent:
クライアントのUserAgentがWindowsの場合にはcharsetをShift-JISに設定します。(デフォルトはUTF-8)

response['Content-Disposition'] = 'attachment; filename="{}"'.format(urllib.parse.quote(file_name))
attachmentをつける事で表示せずにダウンロードが始まります。

df.to_csv(path_or_buf=response, sep=',', float_format='%.2f', index=True, decimal=",")
CSVに書き出します。


株式会社ファントムへのお問い合わせ

群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。




    Show Comments (0)

    Comments

    Related Articles

    Python

    Pytorchで画像分類の精度を高める

    今回、画像分類で精度を高めるために複数データの入力できる学習モデルを作成した。その経緯から始めて実際のモデリングまでを書くことにする。 前提 今回は洋服の図面を読み込み、それがなんの種類かを判別するCNNを作成した。 図 […]

    Posted on by EIGHT
    Other

    GitHub CopilotをPyCharmで使用するまでの手順

    GitHub CopilotをPyCharmで使用するまでの手順 GitHub Copilotは、プログラミングの効率を飛躍的に向上させるツールで、開発者にとって非常に便利なコーディングのサポートを提供します。本記事では […]

    Posted on by press

    最新情報をお届けします!

    メーリングリストに登録するとファントムの最新情報をお届けします

    お客様のメールアドレスを共有することはありません