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


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

    Pythonのargparseでコマンドライン引数をパース

    Pythonのargparseでコマンドライン引数をパース argparseモジュールを使って、Pythonを実行する際にコマンドライン引数を指定してプログラム内に情報を渡す方法です。 引数によって処理を変えたり、別々の […]

    Posted on by press
    Python

    多次元配列から最大値、最小値を取得

    多次元配列から最大値、最小値を取得 Pythonで複数の配列からなる多次元配列から最大値、最小値を取得する方法です。一次元配列も同じやり方で最大値、最小値を取得可能です。 モジュールのインストール ソースコード arr1 […]

    Posted on by press

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

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

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