Feedbackからの出力データの漢字コード

Feedbackからの出力データの漢字コード

- Takumi NAKANO の投稿
返信数: 9

フィードバックモジュールでアンケート結果をExcel形式で保存したら,漢字コード(問題と入力データ)が文字化けしました.

Moodle1.8.2+ Feedback19 正常 このデータをxmlで保存
Moodle1.7.2 Feedback17 文字化け 上記のxmlデータをインポート 表示は正常

ただし,新しいバージョンで作成したアンケートデータのxmlをインポートしています.

漢字コードを変換する簡単な方法は,ないでしょうか?

Takumi NAKANO への返信

Re: Feedbackからの出力データの漢字コード

- Minoru Akiyama の投稿
秋山@eラーニングサービスです

EXCELのダウンロードのときにプログラムの中で設定されているバージョンが古いために起こるようです。
近々整理して報告します。
Minoru Akiyama への返信

Re: Feedbackからの出力データの漢字コード

- Takumi NAKANO の投稿

漢字コードは,次の変更で解決しました.

この現象を解決するためにはmod/feedbackフォルダのanalysis_to_excel.phpの66行目の

   $workbook->setVersion(8);

という記述を、

   $workbook->setVersion(10);

に変更してみてください。

ありがとうございました.

Takumi NAKANO への返信

Re: Feedbackからの出力データの漢字コード

- Tatsuya Shirai の投稿

feedbackモジュールの話ではないのですが.

$workbook->setVersion(8);

$workbook->setVersion(10);

とする話に関して.

  lib/excelclass.lib.php中,function MoodleExcelWorkbook($filename) の中にも同じsetVersion(8)があります.これをsetVersion(10)にすると評定のダウンロードでExcelファイルの中身が文字化けします.その反面,どんなに頑張ってもうまくいかなかったワークシート名(=’評定’)が,

grade/lib.php中の

        $myxls =& $workbook->add_worksheet($strgrades);

        $myxls =& $workbook->add_worksheet(mb_convert_encoding($strgrades, 'SJIS-WIN'));

とすると,化けなくなりました.

setVersion()とMS-Office内部文字コードとの間に関係がありそうな気がします.プログラム中のコメントには,UTF-16LEに変換しなければいかん,
    /// Prepare it to accept UTF-16LE data and to encode it properly
ものもあります.てっきりUTF-8なのだと思っていたのですが,Moodleの内部でUTF-8からUTF-16LEに変換していたのですね.

 関わりのありそうなクラスを以下に示します.(lib/excellib.php, Moodle1.8.3+)

/**
* Define and operate over one Moodle Workbook.
*
* A big part of this class acts as a wrapper over the PEAR
* Spreadsheet_Excel_Writer_Workbook and OLE libraries
* maintaining Moodle functions isolated from underlying code.
*/
class MoodleExcelWorkbook {

    var $pear_excel_workbook;
    var $latin_output;

    /* Constructs one Moodle Workbook.
     * @param string $filename The name of the file
     */
    function MoodleExcelWorkbook($filename) {
        global $CFG;
    /// Internally, create one PEAR Spreadsheet_Excel_Writer_Workbook class
        $this->pear_excel_workbook = new Spreadsheet_Excel_Writer($filename);
    /// Prepare it to accept UTF-16LE data and to encode it properly
        if (empty($CFG->excelisofiles) && empty($CFG->latinexcelexport)) { /// Only if don't want to use latin (win1252) stronger output
            $this->pear_excel_workbook->setVersion(8);
            $this->latin_output = false;
        } else { /// We want latin (win1252) output
            $this->latin_output = true;
        }
    /// Choose our temporary directory - see MDL-7176, found by paulo.matos
        make_upload_directory('temp/excel', false);
        $this->pear_excel_workbook->setTempDir($CFG->dataroot.'/temp/excel');
    }

”課題の評定”や”小テストの受験結果等”はこちらを利用してExcelファイルを作成しているようです.山田さんの問題3(Excelファイルの中身が文字化け)も,関わりがありそうです.気になるのは,$CFG->excelisofiles, $CFG->latinexcelexportの2つですね.いずれかに値がセットされていたら,強制的にlatin扱いされます.どこでこれらの値を設定しているのかな?


 この二つの変数のうち,$CFG->latinexcelexportは,サイト管理-言語設定-言語設定のExcelエンコーディング(プルダウンメニュで,"Unicode"と"Latin"が選択可能)のようですね.excelisofilesはmoodleフォルダにも,moodledata/langフォルダのどのファイル内にも存在しないようです(grepで調べた限りでは).雰囲気としては,Excel ISO filesっぽいですよね.

Takumi NAKANO への返信

Re: Feedbackからの出力データの漢字コード

- Tatsuya Shirai の投稿

 Moodle1.8.3+に同梱されているPAERライブラリのSetVersion()は以下のように8以外には対応していない.

    function setVersion($version)
    {
        if ($version == 8) { // only accept version 8
            $version = 0x0600;
            $this->_BIFF_version = $version;
            // change BIFFwriter limit for CONTINUE records
            $this->_limit = 8228;
            $this->_tmp_format->_BIFF_version = $version;
            $this->_url_format->_BIFF_version = $version;
            $this->_parser->_BIFF_version = $version;

            $total_worksheets = count($this->_worksheets);
            // change version for all worksheets too
            for ($i = 0; $i < $total_worksheets; $i++) {
                $this->_worksheets[$i]->_BIFF_version = $version;
            }

            $total_formats = count($this->_formats);
            // change version for all formats too
            for ($i = 0; $i < $total_formats; $i++) {
                $this->_formats[$i]->_BIFF_version = $version;
            }
        }
    }

feedbackモジュールでは,このPEARライブラリは使用していないのでしょうか.

Tatsuya Shirai への返信

Re: Feedbackからの出力データの漢字コード

- Yuichi Saotome の投稿
五月女です.

確認してみましたが同じものを呼び出している様子です.

確認環境
Moodle1.8.3+ 2007/11/21版
Feedback 2007/07/31.01版

Feedbackモジュールでは
mod/feedback/analysis_to_excel.phpの65行目から69行目にかけて
65: // Creating a workbook
66: $workbook = new EasyWorkbook("-");
67: $workbook->setTempDir('/srv/www/moodledata');
68: $workbook->send($filename);
69: $workbook->setVersion(8);
というコードになっていて,69行目でsetVersion(8)が呼び出されています.
66行目のEasyWorkbookはmod/feedback/easy_excel.phpで定義されており,
これはlib/PEAR/Spreadsheet/Excel/Writer.phpのSpreadsheet_Excel_Writerを継承したクラスになっています.
この
Spreadsheet_Excel_Writerというクラスはlib/PEAR/Spreadsheet/Excel/
Writer/Workbook.phpのSpreadsheet_Excel_Writer_Workbookを継承しており,
このクラス内に白井先生ご指摘のsetVersion()関数が存在しています.
Yuichi Saotome への返信

Re: Feedbackからの出力データの漢字コード

- Tatsuya Shirai の投稿

 だとすると,setVersion(10)を指定するということはsetVersion(9)やsetVersion(7)でも同じで,本来は設定すべき変数の設定を行わないということにならないでしょうか? エラーを発生しないのはとてもPHP的だと思うのですが,UTF-16LEへの変換が行われないなどの問題が発生しそうな気がしました.

 もしかしたらserVersion(10)に対応したPEARライブラリが存在するのかな?と淡い期待も抱いています(多分,あるのでしょう).

Tatsuya Shirai への返信

Re: Feedbackからの出力データの漢字コード

- Yuichi Saotome の投稿
五月女です.

試しにPEAR本家で配布されている物(http://pear.php.net/package/Spreadsheet_Excel_Writer)を確認してみましたが,残念ながら同じでした.
しかもこのライブラリは2006-09-26から新規リリースがありませんね...

淡い期待を抱いてCVSのリポジトリも覗いてみましたが,いくつか修正はあるものの,問題の箇所は修正されていませんでした...
http://cvs.php.net/viewvc.cgi/pear/Spreadsheet_Excel_Writer/Spreadsheet/Excel/Writer/Workbook.php?revision=1.2&view=markup
Takumi NAKANO への返信

Re: Feedbackからの出力データの漢字コード

- Timothy Takemoto の投稿

久しぶりです。まだmoodle 1.6を使っている武本Timothyです。

mod/feedbackフォルダのanalysis_to_excel.phpには
 $workbook->setVersion(8);
もありません。sad
 $workbook->setVersion(10);
追加しましたら、Excelのブックには
<br />
<b>Fatal error</b>:  Call to undefined function:  setversion() in <b>/home10/at1/econo/public_html/moodle16/mod/feedback/analysis_to_excel.php</b> on line <b>64</b><br />
とあっただけです。

   $workbook->send($filename);
を加えたら
<br />
<b>Fatal error</b>:  Call to undefined function:  send() in <b>/home10/at1/econo/public_html/moodle16/mod/feedback/analysis_to_excel.php</b> on line <b>63</b><br />
とありました。

Moodle 1.6での文字化け解消方法はございませんでしょうか。

昔は成績でも同じ問題がありましたが、CVSでダウンロードして、エディターで文字コードを
UTF-8からJSISに変換したら、乗り越えることができました。しかしxlsのファイルしかありません。
それをエディターで開くとさすが、UTF-8では内容が見えますが、SJISで保存し直すとExcel
ファイルとしては認識されなくなります。

よろしくお願いします。