BK通信 ―Bad Knowhow Tsushin―

#05 ブラウザのバッドノウハウ コンテンツ編

この記事を読むのに必要な時間:およそ 4 分

日本語ファイル名とWebの世界

本題に戻って,Webの世界ではどうすべきかというと,これは厄介な問題です。以下の6パターンを調査してみました。

%+ UTF-8
filename=%E3%81%82%E3%81%84%E3%81%86.txt
%+ Shift_JIS
filename=%82%A0%82%A2%82%A4.txt
生UTF-8
filename= あいう.txt
生Shift_JIS
filename= あいう.txt
RFC 2231
filename*=UTF-8''%E3%81%82%E3%81%84%E3%81%86.txt
RFC 2047
filename="=?UTF-8?B?44GC44GE44GGLnR4dA==?="

結果は以下のとおりです注9⁠。

 %+
UTF-8
%+
SJIS
生UTF-8生SJISRFC
2231
RFC
2047
FF3【Win】××
FF3【Mac】×××
IE7××××
Chrome×××
Safari3【Mac】××××××

ひとまず,6パターン全滅しているSafariを無視して考えれば,FirefoxのときはRFC 2231形式,IE7とChromeのときはファイル名をUTF-8でパーセントエンコードすればよさそうです。生のShift_JISを使うのは,日本語ロカール(locale)以外のWindowsが使われている可能性を考えると,避けたいところです(他の言語のWindowsにShift_JISでファイル名を送ると文字化けします⁠⁠。

注9)
正確なブラウザのバージョンはFirefox 3.0.1(Windows⁠⁠,Firefox 3.0.3(Mac⁠⁠,IE7 7.0.5730.13,Chrome 0.3.154.9(Windows⁠⁠,Safari 3.1.2(Mac)です。

IE7が長いファイル名を切り詰める問題

ところが,パーセントエンコードには落とし穴がありました。

IEには一定の条件を満たすと長いファイル名を短く切り詰めるという仕様があり,パーセントエンコードを使った場合,この条件が比較的簡単に満たされてしまいます。

たとえば,⁠日本語の長いファイル名をつけたいときもあります.txt」というファイル名をパーセントエンコードして,リスト6のようなlenameパラメータを送ると,手元の環境では「%81%84ファイル名をつけたいときもあります.txt」というファイル名に切り詰められてしまいました図2⁠。

リスト6 パーセントエンコードで送る

filename=%E6%97%A5%E6%9C%AC%E8%AA%9E%
E3%81%AE%E9%95%B7%E3%81%84%E3%83%95%
E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%
E3%82%92%E3%81%A4%E3%81%91%E3%81%9F%
E3%81%84%E3%81%A8%E3%81%8D%E3%82%82%E3
%81%82%E3%82%8A%E3%81%BE%E3%81%99.txt

図2 切り詰められた

図2 切り詰められた

一方,生のShift_JISを使って次のようなlenameパラメータを送った場合はファイル名は切り詰められません。

  • filename=日本語の長いファイル名をつけたいときもあります.txt

Microsoftのフォーラムの情報によると,IEは「インターネット一時ファイル内のキャッシュ」のファイル名の長さに制限があり,パーセントエンコードを使うとこの制限を簡単に超えてしまうというのが問題のようです。

というわけで,長い日本語ファイル名を使いたい場合(かつ日本語ロカールのWindowsを想定してもいい場合⁠⁠,IEには生のShift_JISを送るのがいいようです。

MacのSafari 3の対処法

前述のとおり,MacのSafari 3ではContent-Dispositionヘッダのlenameを使って日本語のファイル名を指定するのは諦めるしかなさそうです。

ただし,まったく対処法がないわけではなく,Safari 3はContent-Dispositionにlenameが含まれない場合はURLのパスの部分を元にファイル名を決めるので,Content-Dispositionヘッダにはattachmentパラメータだけを含め,次のようなURLにすれば「あいう.txt」を保存させることができます図3⁠。

  • http://localhost/webapp/%E3%81%82%E3%81%84%E3%81%86.txt

図3 やっとできた

図3 やっとできた

残念ながら,次のようにURLのクエリ部分(?の後ろ)に指定しても無視されてしまいます。

  • http://localhost/webapp/foo.cgi?dummy=%E3%81%82%E3%81%84%E3%81%86.txt

Webアプリケーションの作り方によっては,Safari 3の問題を回避するURLを提供するのは難しいかもしれません。

まとめ

今回は,コンテンツの扱いに関連するブラウザのバッドノウハウを紹介しました。ブラウザでファイルをダウンロードするなど簡単なことに思えますが,実は膨大なるBKが必要な高度な技であることがわかりました。とくに,日本語ファイル名の扱いはWebの時代になっても相変わらずややこしく,永遠のBKテーマなのではないかと思います。

著者プロフィール

高林哲(たかばやしさとる)

ソフトウェアエンジニア。バッドノウハウの研究,スルー力の探究,自転車置場の建設,Binary 2.0の布教などの活動を行っている。共著に『Binary Hacks』(オライリー 2006年)。ブログはhttp://0xcc.net/

著書