spacer
spacer
開発者の談話室

Content-Disposition FireFoxとIEの挙動の違い

|

ファイルダウンロードするプログラムを作成する際にはHTTPヘッダに下記の表記を追加します。

Content-Disposition: attachement; filename=<ファイル名>

しかし、ダウンロードファイルに日本語や記号を含む場合、なにもしないと文字化けが発生します。
これは、各社のブラウザがContent-Dispositionのフォーマットに関する実装をRFC通りに実装していなため、英語圏以外で問題が発生しています。

ファイルをダウンロードする ASP.NET Web ページで日本語ファイル名が文字化けする
原因
Internet Explorerでは、Content-Disposition ヘッダが送信された場合、送られてきたコンテンツをそのままブラウザで開かずにファイルダウンロードダイアログを表示するようになっています。その際にこのヘッダの filename パラメータを利用している場合、このパラメータで渡されたファイル名をファイルの保存時の既定のファイル名にします。ただし、クライアントコンピュータのロケールを日本語にしている場合、Internet Explorer ではこのパラメータで渡された文字列 (ファイル名) を Shift-JIS でエンコードされているものとして処理します。
また、ASP.NET および .NET Framework では、構成ファイル globalization エントリ responseEncoding 属性の設定に関わらず、HTTP ヘッダを UTF-8 でエンコードして送信します。Internet Explorer では、UTF-8 でエンコードされたファイル名を Shift-JIS でエンコードされているものとして処理するため、ファイル名を正しく表示できません
Content-Disposition ヘッダのパラメータの文字コードのエンコード方式に関しては、RFC2231 に基づくべきですが、現行の Internet Explorer はこのエンコード方式をサポートしていません。 RFC2231 につきましては、以下の URL をご参照ください。

Microsoftではファイル名をURLエンコードして回避するようにと記載していますが、これですとFireFoxなどほかのブラウザで文字化けをしてしまします。

ブラウザ毎にContent-Dispositionの記載を変更できるのであれば、IE向けにはURLエンコードをし、FireFoxにはなにもしないという対処もあります。

ASP.NET環境であれば下記の対応をするのがもっともシンプルかとおもいます。

Response.HeaderEncoding  = System.Text.Encoding.GetEncoding( "SHIFT-JIS" );

IE用に強引にSHIFT-JIS送信してあげればいいわけです。
ただし、これでは一部文字がまだ文字化けします。化けるのは2バイトコードで考えた場合、下位バイトが「5C」、「7C」の場合です。
「予 (0x975c)」→「誉 (0x975f)」 「表 (0x955c)」→「廟 (0x955f)」

これを避けるためには、該当する文字をURLエンコーディングしてあげます。(すべてURLエンコーディングしないのは、一定以上の文字列長になった場合にファイル名を省略するのを避けるためです)

 

そのほか参考情報

ダウンロード時に日本語ファイル名が文字化け

MSDNフォーラム日本語ファイルのダウンロードについて

 

(追記 2008/6/4)

FIX: ASP.NET で Response.Addheader 方法を使用する場合、応答ヘッダーが UTF-8 として常にエンコードされます。

.Net 1.1にはサービスパックがでています。

private void Page_Load(object sender, System.EventArgs e) {
               string filename="<Some Korean Characters>.txt";

               Response.ContentType = "text/plain";
               Response.Clear(); 
               byte[] buffer={65}; 
               Response.AddHeader("Content-Disposition","attachment;filename="+filename); 
               Response.BinaryWrite(buffer);
               Response.Flush();
               Response.End();
 }

本当にこれで文字化けしないのかは未確認です。
このFIXがあがったのと、前述の引用ページの日付をみるとこちらのほうが古いんですよね・・・。

(追記 2008/9/5)

文字化けとは別に、ファイル名が途切れる問題が存在します。

こちらが発生する原因は、IEではダウンロードファイルをキャッシュフォルダに一時保存するのですが、そのときに「フォルダパス名 + ファイル名」が255文字を越えると途中で途切れます。

C:¥Documents and Settings¥(ユーザ名)¥Local Settings¥Temporary Internet Files¥Content.IE5¥xxxxxxxxx[0].zip

ユーザ環境によって発生条件が変わるのがいやらしい現象です。これといった解決方法はないので、あきらめて短めのファイルをアップ・ダウンするしかないのが現状です。

 

メッセージ送信

この記事に対してのご意見をお聞かせ下さい。
頂いたメッセージは訪問者様に読みやすいよう整形したのち公開させて頂く場合がございます。
 



 
spacer
spacer