いちSEのつぶやき

エンジニアとして、気になることを残していきます。

IEでのファイルダウンロード文字化け問題

IEでファイルをダウンロードする時に文字化けが起きたので調査。


通常は、以下のようにURLエンコードしてあげれば問題ない。

 String dFilename = URLEncode.encode(finename,"UTF-8");
  response.setHeader("Content-Transfer-Encoding","binary");
  response.setHeader("Content-Type","application/force-download;charset=UTF-8");
  response.setHeader("Content-Disposition","attachment; filename=" + dFilename);

しかし、これだと一定以上の文字数でダウンロードダイアログで文字化けが発生。


原因は、文字数制限。
  ⇒


IEでは255バイトを超える文字は文字化けする仕様らしい。


しかも、UTF-8でのエンコードだと全角が6バイト9バイトに変わってしまうため、
文字数の制限が激しい。


さらに、HttpHeaderに何を設定してもIEShift_JISエンコードされているものと
判断するらしい。
 ⇒


対応としては、IEでダウンロードさせる場合は、
Shift_JISエンコードしてHttpHeaderに設定させてあげればOK。

 String dFilename = new String(finename.getBytes("Windows-31J","ISO-8859-1"));



この場合、IE7の5C/7C問題に引っかかるが、すでにパッチがでているから最新を適用すれば大丈夫。
 ⇒IE7で、ダウンロード時に特定の文字が化ける - 倖せの迷う森


ただし、それ以前のIEだと、コロンやセミコロンなどの2バイト目が5C/7Cの文字が
ファイル名に含まれているとNG。


【参考】
負けるな!新人SEのノンストップ自己研鑽生活(Javaプログラマ&新人パパの子育て日記帳) ファイルダウンロード時の日本語ファイル名の文字化け
IEでファイルダウンロード時の文字化け - guccyonikki