宇田川です。
多分に憶測が入っているので違っていれば指摘頂ければと思います。
Moodle1.9系列は2バイト文字のファイル名を正しく扱えなかったと記憶しておりますので、三重大学版で2バイト文字を含むファイルをダウンロードした場合とさせていただきます。 ( http://oku.edu.mie-u.ac.jp/miemoodle/ )
lib/filelib.phpを見ると601行目付近に以下のような記述があります。
// if user is using IE, urlencode the filename so that multibyte file name will show up correctly on popup (hacked by okumura and shirai)
if (check_browser_version('MSIE')) {
$t = rawurlencode($filename);
if (strlen($t) > 21 * 3 * 3) {
$filename = mb_convert_encoding($filename, "SJIS-WIN", "UTF-8");
$filename = str_replace('#', '%23', $filename);
} else {
$filename = $t;
}
}
これでWebブラウザがIEの場合はファイル名をsjis-winにしているのですが、IE11ではUser AgentにMSIEの文字列を返さないように変更されているようです(未検証です)。 ( http://www.buildinsider.net/web/ie11preview/01 )
そのため、IE11も引き続きファイルダウンロード時にsjis-winで指定する必要があるのであれば(未検証です)、フィルタに引っかからずにダウンロード時に文字化けが起きるのだと思われます。
解決策としましてはブラウザの互換性機能を利用して古いUser Agentを送出するように利用者側で対応するか、当該部分を書き換えてIE11でもフィルタを通るようにするのが適当だと考えます。
if (check_browser_version('MSIE') && !check_browser_version('MSIE',11)) {
駄目(ご指摘いただいた通りです。多謝)
lib/moodlelib.phpのcheck_browser_versionの定義に
case 'Trident':
if (preg_match("/Trident/i", $agent)) {
return true;
}
break;
を入れて
if (check_browser_version('MSIE') || check_browser_version('Trident')) {
駄目
で止まっています。
IE11の動作しているPCが用意できましたのでこちらの環境でも実際に確認してみました。三重大学版とは異なりますが、同様にIE用にカスタマイズしてあります。
まずお詫びいたします。前に書いたコードの処理は別の部分でした、本当はlib/filelib.php 723行目付近になります。
確認と対策は以下のように行いました。
- IE10環境で日本語ファイル名のファイルをアップロードしてダウンロード強制のリソースに指定する。
- IE11環境でファイルをダウンロードしようとするとファイル名が化ける。
- lib/filelib.phpの723行目付近の if(check_browser_version('MSIE')){} 部分をコメントアウトして、強制的にsjisに変換させるように変更。再度IE11環境でファイルのダウンロードを試みて問題が無いことを確認した後、コメントアウトを元に戻す。
- lib/moodlelib.phpのMSIEとしての判定部分に適当なコードを加えてIE11環境で問題なくダウンロードできることを確認。
奥村先生の投稿では4については別User Agent扱いにされていましたが、個人的にはMSIEとして問題ないと判断したため、case 'MSIE' 中に判別処理を入れています。 ( http://www.openspc2.org/userAgent/ )