IE7でダウンロードをするとファイル名の日本語部分が変に化ける

2007.02.26 Author: ぴ

通常、ファイルダウンロード時にファイル名を指定するには、httpのヘッダ部で
Content-Disposition: attachment; filename="ファイル名"
とすることで、指定した「ファイル名」で出力することが可能である。

ただし、ファイル名を日本語で出力する場合は、SJISで出力してあげないと文字化けしてしまう。また、一般的にファイル名部分をURLEncodeしてあげることでも、文字化けせずに出力が可能である。

IE7(Internet Explorer 7)で日本語ファイル名でダウンロードする際に問題がある。ファイル名に「構築」や「予約」等の文字が含まれている場合、直接SJISで出力してあげると不可解な文字化けを起こしてしまう。たとえば、「構築」の場合は「構」の字が「浩」になり、「予約」の場合は「予」の字が「誉」になってしまう。

調査してみるとIE7のバグらしく、SJISで2バイト文字の2バイト目が「5C」「7C」になっている場合、IEが「5E」として認識してしまうらしい。まぁ、SJIS自体が制御コードと文字コード体系がかぶっており、特に「5C」で終わる文字は「5C文字」と呼ばれ、SJISで文字を扱う場合は非常に厄介なものです。
※ なので、ソースコードはUTF-8やEUCで記述するといいですよ。

IE7のSP1あたりで解消されるとの情報は得たが、それまで待ってもいられないので、当面ファイルのダウンロードにFirefoxを使えば文字化けはしないで済むことは分かった。がー。それでは負け組になってしまうので、なんとかしようと思っていろいろ試してみた。

1. SJIS出力をやめ、全部URLEncodeしてしまう。
この方法で解決するには解決するのだが、ファイル名が長い場合はIEが勝手にファイル文字列の先頭を無視してしまう。まぁ、URLEncodeすれば、通常2バイトで済んでいたデータが6バイト分も消費されてしまうので、当たり前と言えばそうなのだが…。

2. それなら…
文字化けする「5C」「7C」で終わる文字だけをURLEncodeしてしまえばよいのでは?という考えに立ち、実際に実装してみたところ…

うまく動きました。これにて一見落着!

総括:
奇妙なバグはやめてほしい(バグだからそういうものといえば、ねぇ…)