* 添付ファイルダウンロードで日本語ファイル名が文字化けする [#aae7bc36] - ページ: [[BugTrack2]] - 投稿者: [[umorigu]] - 優先順位: 重要 - 状態: 提案 - カテゴリー: 本体バグ - 投稿日: 2014-07-08 (火) 07:10:10 - バージョン: 1.4.7_notb ** メッセージ [#idb49bc3] 添付ファイルが日本語ファイル名である場合、ダウンロード時に文字化けが発生します。 また、PHP5.4で動作させた場合、含まれている文字によっては "index" というファイル名でダウンロードされます。 ** 環境 [#of05b395] - Internet Explorer 9以降 (IE8以前は文字化けしない) - Chrome, Firefox, Safari など他の多くのブラウザ ** 原因 [#je23f5c1] attach.inc.php : 709 の open() で 709 case 'MSIE/default': 710 $filename = mb_convert_encoding($filename, 'SJIS', 'auto'); 711 break; ... 714 $filename = htmlsc($filename); 720 header('Content-Disposition: inline; filename="' . $filename . '"'); 710行目で SJIS に変換しているが、これは古いIE(IE8以前)の動作にあわせた実装 714行目の htmlsc(htmlspecialchars)は、ここで使うのは適切でない。 SJISバイナリそのままhttp_outputに渡すのが元の意図と思われる。 ** 解決策 [#j506f59c] 2014年7月現在、多くのWebブラウザが RFC 6266 に対応しているので、RFC 6266 (Content-Disposition: filename*=utf-8''<rawurlencode_file_name>) を実装することで日本語を含むnon-ASCII文字を含むファイル名を正しくダウンロードできる。 また、旧実装(filename=)を残しておくことで古いブラウザに対しては今まで通りの動作となる。 ** 対応実装 [#p608522c] plugin/attach.inc.php @@ -711,13 +711,13 @@ break; } } - $filename = htmlsc($filename); + $utf8filename = mb_convert_encoding($filename, 'UTF-8', 'auto'); ini_set('default_charset', ''); mb_http_output('pass'); pkwk_common_headers(); - header('Content-Disposition: inline; filename="' . $filename . '"'); + header('Content-Disposition: inline; filename="' . $filename . '"; filename*=utf-8\'\'' . rawurlencode($utf8filename)); header('Content-Length: ' . $this->size); header('Content-Type: ' . $this->type); URL: [[sourceforge.jp/users/umorigu/pf/pukiwiki15/scm/commits/b8dda6bf557989c0324c3002f242d997cd91cebd>cvs:../../../../../users/umorigu/pf/pukiwiki15/scm/commits/b8dda6bf557989c0324c3002f242d997cd91cebd#]] ** 補足 [#f881a85b] - Safariなど、RFC 6266に対応していないブラウザでは文字化けしたまま -------- - たぶん関連: [[開発日記/2004-11-11]]、[[BugTrack/687]]、[[BugTrack/743]]。 -- &new{2014-07-09 (水) 00:31:40}; - 今ではUTF-8標準が当たり前になっているので、[[原因>#je23f5c1]]の箇所でswitch-case分岐のdefaultをUTF-8変換にして、Mozilla/4.0以下(pukiwiki.ini.php のUser-Agent settings にはMozilla/3.0の古いブラウザもリストに残っている)などのHTML5に非対応のうち必要なものだけSJISで渡すぐらいでもいいのかもしれない? -- &new{2014-07-09 (水) 00:44:01}; #comment