ファイルダウンロード

ファイルダウンロードプログラムを組んでいると、ファイル名の文字化けが起こるので、「ファイルダウンロード時に文字化けしないようにする方法は?」ってのはよくある質問。誰もが一度ははまる。

で、回答はこんな感じ。

fileName= new String(fileName.getBytes("Shift_JIS"), "8859_1");

最初これは何をしているのかさっぱりわからんかった。ファイル名をShiftJISエンコードしたバイト列を、ISO8859_1で文字列を作成している。当然化け化け。だってISO8859_1はASCIIをちょっと拡張した程度のもんで、日本語なんか扱えないもの。けどこれで確かにIEでは文字化けせずに動作する。
それは、どうもIEが8859_1 → ShiftJIS(Windows-31Jかも)と変換してるっぽい。「ぽい」、と書いたのはpublicなドキュメントを見つけられなかったので。もしかしたらtomcatのせい!?とも思ったけど、ネット見てたらIEではいけたけどNNではダメ、とかもあるのでやはりブラウザの内部仕様だと思われる。

実際こんなプログラムを組むと確かに復元できる。

String name = "あああ.txt";
String convertName = new String(name.getBytes("Shift_JIS"), "8859_1");
System.out.println(new String(convertName.getBytes("8859_1"), "Shift_JIS"));

Vistaちゃん

でもね、Vistaちゃんはどうするの??Vistaで追加されたJIS2004Shift_JISでは変換できませんよーっと。
そもそも、Vistaで追加された文字をファイル名に使っているファイルを、サーバーにUPして、それをXPからエクスプローラーごしに見ると「□」に化けている・・・
当然フォントはちゃんと追加してます!事実、htmlにvista追加文字を含んだ文字がちゃんと表示されるし。
なんかファイル名だけ変な扱いだなぁ。


追記(2007/12/1)

そもそも、Vistaで追加された文字をファイル名に使っているファイルを、サーバーにUPして、それをXPからエクスプローラーごしに見ると「□」に化けている・・・

これ、原因はクラシックスタイルを採用していることでした。XPスタイルに戻すと普通に見えました。どういう理屈かはさっぱりわかりません。