日本語ファイル名(マルチバイト)ダウンロード時の文字化け対応

日本語ファイル名(マルチバイト)ダウンロード時の文字化け対応

- TEAM 4 の投稿
返信数: 2

はじめて投稿致します。

現在Moodle2.2.2+(Build20120315)を利用しているのですが、小テストの受験結果ファイルをファイルダウンロード時に日本語文字化けが発生するため、ソースを修正してみました。

別途、修正方法などがあれば情報共有していただけると幸いです。

再現環境:WindowsXP+IE8、Windows7+IE9、Windows8評価版+IE10

再現手順:小テストの受験結果から「テーブルデータをダウンロードする」→「Microsoft Excelスプレッドシート形式」を選択

修正概要:ブラウザがIEの場合、rawurlencodeを実施

修正箇所:./mod/quiz/report/reportlib.phpの365行目~

●修正前

function quiz_report_download_filename($report, $courseshortname, $quizname) {
    return $courseshortname . '-' . format_string($quizname, true) . '-' . $report;
}

●修正後

function quiz_report_download_filename($report, $courseshortname, $quizname) {
    //return $courseshortname . '-' . format_string($quizname, true) . '-' . $report;
    $user_agent =  $_SERVER['HTTP_USER_AGENT'];
     if (mb_ereg("MSIE", $user_agent)){
         return rawurlencode($courseshortname . '-' . format_string($quizname, true) . '-' . $report);
     }else{
         return $courseshortname . '-' . format_string($quizname, true) . '-' . $report;
     }
}

現状では問題なく動作しております。

以上、よろしくお願いいたします。

評点平均: お役立ち度: ★★★★★★★ (2)
TEAM 4 への返信

Re: 日本語ファイル名(マルチバイト)ダウンロード時の文字化け対応

- TEAM 4 の投稿

評定管理のエクスポートでも文字化けが発生してましたので、修正致しました。

再現環境:WindowsXP+IE8、Windows7+IE9

再現手順:①コース→評定管理→エクスポート→テキストファイル→送信→ダウンロード
        ②コース→評定管理→エクスポート→Excelスプレッドシート→送信→ダウンロード

修正概要:ブラウザがIEの場合、rawurlencodeを実施

■テキストファイル形式(./grade/export/txt/grade_export_txt.phpの70行目~)
    $downloadfilename = clean_filename("$shortname $strgrades");
    $user_agent =  $_SERVER['HTTP_USER_AGENT'];
    if (mb_ereg("MSIE", $user_agent)){
        $downloadfilename = rawurlencode($downloadfilename);
    }
    header("Content-Disposition: attachment; filename=\"$downloadfilename.txt\"");

■Excelスプレッドシート形式(./grade/export/xls/grade_export_xls.phpの37行目~)
    $downloadfilename = clean_filename("$shortname $strgrades.xls");
    $user_agent =  $_SERVER['HTTP_USER_AGENT'];
    if (mb_ereg("MSIE", $user_agent)){
        $downloadfilename = rawurlencode($downloadfilename);
    }

※それぞれ赤字箇所を追加致しました。
その他、良い方法などあれば共有をお願い致します。

評点平均: お役立ち度: ★★★★★★★ (2)
TEAM 4 への返信

Re: 日本語ファイル名(マルチバイト)ダウンロード時の文字化け対応

- TEAM 4 の投稿

./lib/filelib.phpのsend_file()が使用される処理を教えていただけますでしょうか。

現在、1回目の投稿にあります./mod/quiz/report/reportlib.phpを修正して動作確認していたところ、小テストの受験結果から「テーブルデータをダウンロードする」→「OpenDocumentスプレッドシート形式(ODS)」にて
文字化けが発生することが判明致しました。

原因は、./mod/quiz/report/reportlib.phpでのrawurlencode()処理後に
./lib/filelib.php1784行目のrawurlencode()によって2回rawurlencode()が実施されていることによるものと考えております。

そこで、./lib/filelib.phpのrawurlencode()処理を外すことを検討しているのですが、その場合の影響範囲を調査しております。
(Moodle2.2.2+およびMoodle2.2.3ではデフォルトで記載されているので、影響範囲が大きいのか気になっております。)
./lib/filelib.phpの1784行目~
    if (check_browser_version('MSIE')) {
        $filename = rawurlencode($filename);
    }

現在は、この$filename = rawurlencode($filename);をコメントアウトして動作確認を実施しているのですが、影響があったのは、評定管理のエクスポートでの「OpenDocumentスプレッドシート」しか確認出来ておりません。
評定管理のエクスポートのみであれば、./grade/export/ods/grade_export_ods.phpのみの対応で問題なさそうなのですが、その他の箇所についてはまだまだ確認しきれていない状況です。

情報がございましたら共有していただけると幸いです。


以上、よろしくお願いいたします。