日本語ファイル名の書き出し(Safari対策)

ファイル名が日本語のファイルをPerl/CGIやPHPから書き出し、ダウンロードさせる場合の処理。
普通は、
Content-Type: application/octet-stream; name=ほげ.gif
Content-Disposition: attachment; filename=ほげ.gif
というHTTPヘッダを出力してあげれば、日本語ファイル名でダウンロードされるのだが、Mac OS XのSafariの場合は、これだとファイル名が文字化けしてしまう。
というのは、Mac OS X では、ファイル名が一般的でないUTF-8の形式(例えば「が」を「か」+「゛」として扱っている)になっているかららしい。

Safariに対応させるためには、HTTPヘッダにファイル名をつけないで、
http://foo.bar/foo.cgi/ほげ.gif?・・・ というように、URLにUTF-8にしたファイル名をつけてあげることで、日本語ファイル名でも文字化けせずにダウンロードさせることができる。

コーディング例:Perl / CGIの場合

$filename = 'ほげ.gif';

if ( $ENV{HTTP_USER_AGENT} =~ /Mac OS X/i ) {
    Jcode->new(?$filename)->utf8;
    if ( $ENV{HTTP_USER_AGENT} =~ /Safari/ ) {
        if ( ! $cgi->param('reloaded') ) {
           # Safariの場合、URLにファイル名を付け加えてリロード
           print "Location: $mydomain$ENV{SCRIPT_NAME}/$filename?reloaded=1&$ENV{QUERY_STRING}";
           exit;
        }
        print "Content-Type: application/octet-stream?n";
        print "Content-Disposition: attachment?n?n";
    } else {
        print "Content-Type: application/octet-stream; name=$filename?n";
        print "Content-Disposition: attachment; filename=$filename?n?n";
    }
} else {
    Jcode->new(?$filename)->sjis;
    print "Content-Type: application/octet-stream; name=$filename?n";
    print "Content-Disposition: attachment; filename=$filename?n?n";
}
#ファイル出力の処理・・・

関連情報(Perl)

Mac OS Xのファイル名については、以下が詳しい
「HTMLに役立つヒント」より、「AppleScript for OS X」→「Perl on OS X」
http://www.kiwi-us.com/~mizusawa/penguin/html_hint...

このページに書かれているように、Encodeモジュールできちんと変換してあげてから、HTTPヘッダに日本語ファイル名つけてあげれば、うまく行くかも知れない(未検証)。うまく行けば、その方がスマートですね。
2006年04月30日(日) 18:21:24 Modified by makoger




スマートフォン版で見る

×

この広告は60日間更新がないwikiに表示されております。