spacer
spacer
開発者の談話室

文字化け: 2007年12月アーカイブ

ファイルダウンロードするプログラムを作成する際には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フォーラム日本語ファイルのダウンロードについて

 

 



 
spacer
spacer