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


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

    Appleシリコン搭載MacのDocker環境でTensorflowを使う

    Appleシリコン搭載MacのDocker環境でTensorflowを使う Intel搭載のMacで作成したTensorflowを使ったプロジェクトを移して、M1やM2などのAppleシリコンを搭載しているMacでTen […]

    Posted on by press
    Django

    DjangoのFormに初期値を設定する

    DjangoのFormに初期値を設定する Djangoで生成したFormをhiddenにしたまま、あらかじめ設定しておいた初期値が入ったvalueをPOSTする方法です。 forms.pyでinitial=’ […]

    Posted on by press

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

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

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