小テストの評定のダウンロードについて(1.8.2+以上)

小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
返信数: 26
平岡です。

Moodle 1.8.2+ から 1.9.2+ に更新すると、小テストの評定をダウンロードする
際に、以下のような問題が発生しました。

サイト管理 > 言語設定 > 言語設定 > Excelエンコーディング: Latinの場合)
Excel形式でダウンロードした場合、評点が移行されておらず、受験者の氏名が文字化け
サイト管理 > 言語設定 > 言語設定 > Excelエンコーディング: Unicodeの場合)
Excel形式でダウンロードした場合、評点は移行できておらず、受験者の氏名が空白

ちなみに、1.8.2+から1.8.3, 1.8.6+ に移行した際には以下のようになりました。
サイト管理 > 言語設定 > 言語設定 > Excelエンコーディング: Latinの場合)
Excel形式でダウンロードした場合、評点は移行できているが、受験者の氏名が文字化け
サイト管理 > 言語設定 > 言語設定 > Excelエンコーディング: Unicodeの場合)
Excel形式でダウンロードした場合、評点は移行できているが、受験者の氏名が空白

尚、1.8.2+ から 1.8.6+に更新したのち 1.9.2+に更新した場合は、評点の移行が
出来ず、受験者の氏名が空白になりました。
(Excel 円コーディング: Unicodeの場合)

つきましては、以下の二点についてご存知の方は教えて頂けませんでしょうか。
1) 1.8.6+から1.9.2+に評点を移行する方法
2) Excel円コーディングをUnicodeにした際に、Excelファイル中の文字列が空白
にならないようにする方法

以上、よろしくお願いいたします。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

 その後,変わりないでしょうか.
 当方では特にそのような問題が発生していないため発言を控えていました.

 一つだけ疑問点です.「評定が移行できている/できていない」とはどのようなことを表しているのでしょうか.評点のことでしょうか? 評点が移行できておらず受験者の氏名が文字化け,という場合ですが,これはExcelの氏名の欄は文字化けしている上に,評点の欄が空白,あるいは'-',あるいは0.0などなど.

 最悪,名前は化けても仕方が無いですよね.でもMoodle1.8.2から1.9にアップデートして点数が消えてしまうとすると,かなり致命的ですよね.

#マルチバイトデータを含んでいますので,基本はLatinではなくUnicodeでないといけない気がします.氏名の後のデータに悪影響を与える可能性があり,その結果,文字化けだけでなく点数の列のデータが消えているのかな?と推測しました.消えているのではなく,'-'や'0.0'がExcelのセルにに入っているのならば問題は別となります.

Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
コメントをいただきありがとうございます。

「評定が移行できている」というのは「評点」のことです。現時点では、
1.8.2+ から 1.8.3 以降(~1.9まで)への移行:(ExcelエンコーディングがUnicodeの場合)
Excelの氏名の欄、受験日時など、評点以外の部分は「空欄」となります。
評点は正しく表示されます。
1.8.2+ から 1.9 以降への移行:(ExcelエンコーディングがUnicodeの場合)
Excelの氏名の欄、受験日時等、評点以外の部分は「空欄」となります。
評点はすべて「空欄」となります。

このような状況であるため、まずは移行後のデータベースの中身を直接確認しようかと思いますが、受験者氏名及び小テストの評点が入っているテーブルは、どれになりますでしょうか。

以上、よろしくお願いします。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

困ってしまうのは,Moodle1.8.2+からMoodle1.9へのアップグレードですね.評点の欄が全て空欄ですか.

 評定のソースリストはMoodle1.9になった時に,ほぼ書き直しに近い大きな変更が加わっています.

 データは"mdl_grade_grades"にありますので,そちらをご覧下さい.
 ちなみにコースの”管理”にある”評定”で,そのコースの評定の一覧表が表示されます.こちらは氏名・評点共に正しく表示されるのでしょうか? もしそうでしたら問題はExcelへのエクスポートだけに絞られそうです.

 なお,Moodle1.9で,新たにコースを作成し,そこに小テストを追加,実際にダミーのユーザで課題を提出して教師が評価,その結果をエクスポートするなどの実験は試されましたか? これでMoodle1.8.2+からのデータの移行の失敗かどうか,ある程度ではありますが,判断材料が得られます.

 また,空欄になるということは,関数(データベースからデータを読み出すあたり)が正常に処理を完了できていない(ユーザIDからユーザ名を得られなかった,なども)ことが考えられます.phperror.logなどのエラーログに何か記録されていないでしょうか?

Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
Shirai様

平岡です。
コメントを頂きありがとうございます。

o 評点が消えてしまう問題
よくよく問題の状況を確認したところ、消えてしまうのはごくごく一部の小テストのみ
で、それ以外の評点は問題なく移行できておりました。なぜごくごく一部の小テストが
移行できないのか不明ですが、その小テストはそもそも「管理」の「評定」の一覧にも
リストアップされていない小テストなのです。
このようなことはあるのでしょうか?
Moodle的には、該当の小テストは「評定」の対象ではないとされてしまう事で、
mdl_quiz_grades から mdl_grade_grades テーブルへの変換が行われず、
結果として評定が消えてしまうように考えられますが、ありえますでしょうか。

o 評定の確認
管理の評定を確認したところ、ブラウザの画面上では(上記小テスト以外は)問題
無く受験者名も評点も表示できておりました。もちろん、mdl_user テーブルの内容
も問題なく表示されました。このことから、今回の問題は、Excel 形式の評定の
エキスポート機能にのみ問題があるように思われます。(テキスト形式では全く
問題ありません)
一点気になるのですが、Excel は Unicode で書かれていても問題なく表示される
のでしょうか。SJIS でないとダメ、といった事は考えられるのでしょうか。

以上、お気づきの点がありましたら、アドバイスを頂けますと幸いです。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

”評点が消えてしまう問題”に関しては分かりません.当方の環境では発生していません.

”Excel形式へのエクスポート”に関して.
ExcelはUnicode(UTF-16LE)でデータを格納しますので問題はありません.
ただ,ワークシート名の処理が正常ではありません.これが原因でExcelのファイルが正しく作成されない問題は発生していました.

 当方で施した対策をこちらに記録してあります.Shirai028のlib/pear/Spreadsheet/Excel/Writer/Workbook.phpに対する改良を試してみて下さい.

Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
平岡です。

上記「対策(Shirai028)を適用したところ、Excelファイルのワークシート名が文字化け
する問題が解決しました。しかしながら、受験者名等セルは空白のままとなっております。
# 評点の以降はほぼ問題ありません。

以上、ご報告まで。
Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
平岡です。

Moodle 1.8.2+ から 1.9.2+(本日時点)に直接バージョンアップを行い再度確認を行いました。

データベース中の評点データや、受験者名データを確認したところ、正し内容が含まれておりました。このため、現時点での問題は「Excel形式でエクスポートした際に、受験者名が空白になってしまう」という点のみです。
テキスト形式では問題ありませんので、Excel形式へのエキスポート処理部分に何らかの問題がある可能性もあると思いますので、ソースの該当箇所を教えていただけませんでしょうか。

また、Moodle 1.9.2 で新たにコースを作成し、小テストを受験して結果をエクスポートした場合にも、データの移行を行った場合と同じく、受験者名が空白となっておりました。
なお、受験者名を日本語、英語に変更した場合でも同じように空白となりましたので、漢字コードに依存する問題ではなさそうです。

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

Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

8月4日付けの返信につけましたリンク先の修正をちょっと試してみて貰えませんか?

 評定をExcel形式でエクスポートするときに作成されるExcelのファイルは”評定”というシート名のブックです.この”評定”が問題を引き起こします.

 あるいは一時的に,grade/export/xls/grade_export_xls.php の冒頭にあるfunction print_grades()の

    function print_grades() {
        global $CFG;
        require_once($CFG->dirroot.'/lib/excellib.class.php');

        $export_tracking = $this->track_exports();

//      $strgrades = get_string('grades');
        $strgrades = 'Grade';

    /// Calculate file name
        $downloadfilename = clean_filename("{$this->course->shortname} $strgrades.xls");
    /// Creating a workbook
        $workbook = new MoodleExcelWorkbook("-");
    /// Sending HTTP headers
        $workbook->send($downloadfilename);
    /// Adding the worksheet
        $myxls =& $workbook->add_worksheet($strgrades);

赤で示したように1箇所だけ修正してエクスポートして見て頂けないでしょうか.
もしこれで状況が好転するならばワークシート名に関するバグが原因です.

Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
平岡です。

grade/export/xls/grade_export_xls.phpの修正を行ってみましたが、受験者名が空白になる問題は改善しませんでした。
ただし、ファイル名やワークシート名は変わりました。(**Gradeに)

以上、よろしくお願いします。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

ご苦労様です.

 ううむ,では新しい状況ですね.

 データの出力は先のgrade_export_xls.phpのprint_grades()の少し先,

    /// Print all the lines of data.
        $i = 0;
        $geub = new grade_export_update_buffer();
        $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
        $gui->init();
        while ($userdata = $gui->next_user()) {
            $i++;
            $user = $userdata->user;

            $myxls->write_string($i,0,$user->firstname);
            $myxls->write_string($i,1,$user->lastname);

            $myxls->write_string($i,2,$user->idnumber);

青文字の2行が氏名です.Excel以外ではきちんと氏名が出力されるということですので,この$userのfirstnameとlastnameが空である,という可能性は考えにくいですよねぇ.

 そうですね,本当にデータが出力されているのかを確かめてみましょう.

        while ($userdata = $gui->next_user()) {
            $i++;
            $user = $userdata->user;
echo $user->lastname.$user->firstname.' ';

            $myxls->write_string($i,0,$user->firstname);
            $myxls->write_string($i,1,$user->lastname);
            $myxls->write_string($i,2,$user->idnumber);
            $myxls->write_string($i,3,$user->institution);
            $myxls->write_string($i,4,$user->department);
            $myxls->write_string($i,5,$user->email);
            $j=6;
            foreach ($userdata->grades as $itemid => $grade) {
                if ($export_tracking) {
                    $status = $geub->track($grade);
                }

                $gradestr = $this->format_grade($grade);
                if (is_numeric($gradestr)) {
                    $myxls->write_number($i,$j++,$gradestr);
                }
                else {
                    $myxls->write_string($i,$j++,$gradestr);
                }

                // writing feedback if requested
                if ($this->export_feedback) {
                    $myxls->write_string($i, $j++, $this->format_feedback($userdata->feedbacks[$itemid]));
                }
            }
        }
die;
        $gui->close();
        $geub->close();

赤文字で示した2行を追加して,Excel形式でエクスポートして下さい.出力されるExcelファイルを保存します.このExcelファイルですが,拡張子こそ.xlsですが,実は中身はテキストファイルです.この.xlsをメモ帳(Windowsの場合)などのテキストエディタで開いて,中身を確認して見て下さい.半角空白で区切られた氏名が延々と1行,続いていればOKです.なお,このテキストファイルがUTF-8形式で無いならば問題です.メモ帳の場合は,[ファイル]-[名前を付けて保存]で開くダイアログで,文字コードの欄を見て下さい.もしここが'UTF-8'ならばOKです.

 とはいえ,これで氏名のデータが出力されなかったり,あるいは違う文字コードで出力されていたとしても,何が原因で,どのように対処すれば良いのか,は,まだまだ先になります.まずは原因の究明です.

Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
赤字の修正を行った上でダウンロードをしたところ、受験者氏名がUTF-8の
文字コードで正しく出力されました。(ファイル名は.xls)

つまり、受験者氏名等の情報は正しく取得することができているにも関わらず、
Excel形式の作成の時にうまくいっていないということでしょうか。
評点は正しくファイル中に記録されていますので、Excel形式を作成する機能
自体に問題があるわけではないと思うのですが・・・。

なお、ExcelエンコーディングはUnicodeとなっております。

以上、よろしくお願いします。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

 かなり万事休すな状態になってきましたね...

 確認です.

 サーバOSの種類,PHPのバージョン,Moodleの種類(オリジナル,三重大版など),クライアントPCのOS,ブラウザ,MS-Officeのバージョン.

 [サイト管理]-[サーバ]-[動作環境]の状態は全てOKでしょうか.

 他に何か特別な設定や特殊事情は無いでしょうか.
 Moodleのパッケージは一部だけ更新したのではなく全ファイルが最新版でしょうか.


多少,ヤケ気味ですが^^,では,半角英数字でも氏名欄は出力されないということは無いのか,

//          $myxls->write_string($i,0,$user->firstname);
//          $myxls->write_string($i,1,$user->lastname);
            $myxls->write_string($i,0,'first');
            $myxls->write_string($i,1,'last');
            $myxls->write_string($i,2,$user->idnumber);
            $myxls->write_string($i,3,$user->institution);
            $myxls->write_string($i,4,$user->department);
            $myxls->write_string($i,5,$user->email);

ダイレクトに'first','last'といった半角英数字文字に固定したらどうでしょう.


 ちなみに大事なことを聞き忘れていました.

 Excelファイルの第1行目はどうなっています?
 ここもすべて空欄でしょうか.
 一行目には,”名 姓 IDナンバー 所属組織 部署 メールアドレス (課題名1) (火題名2)...”といった項目の見出しが日本語で出力されるはずです.もしこの項目が日本語できちんとExcelファイル中に記録されているのだとすると,余計に謎は深まりますが,もしこれらの日本語文字列も空欄になるのだとすると,Excelのフォーマットに関する問題になりそうですね.
(/lib/pear/Spreadsheet以下のファイルが最新のものであるかどうか)


Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
平岡です。

毎度ありがとうございます。

o こちらの環境を書かせていただきます。

サーバOS: Solaris10 SPARC
PHP: 5.2.6
Moodle: オリジナルの moodle-latest-19(ここ数日以内のもの)
同じ問題が Moodle 1.8.3 以降全てで発生します・・・・。
クライアントPCのOS: Windows XP SP2
ブラウザ: IE6, Firefox3
MS-Officeのバージョン: Office 2007(OpenOffice 2.4でも同じ)
その他特別なこと: なし

o Moodle の更新方法
以前のバージョン用のデータベースを pg_dump して、新しいバージョン用の
データベースを作成します。新しい Moodle は以前の Moodle とは別の場所
にインストールを行っております。このため、一部のみが古いままであるという
ことはないと思われます。

o Excel 関連ファイルのタイムスタンプ
% pwd
.../moodle-1.9.2/lib/pear/Spreadsheet/Excel
% ls -alFR
.:
total 7
drwxr-xr-x 3 root root 512 2006-01-05 11:02 ./
drwxr-xr-x 3 root root 512 2006-01-05 11:02 ../
drwxr-xr-x 2 root root 512 2008-08-06 16:52 Writer/
-rw-r--r-- 1 root root 3324 2006-01-04 17:23 Writer.php

./Writer:
total 347
drwxr-xr-x 2 root root 512 2008-08-06 16:52 ./
drwxr-xr-x 3 root root 512 2006-01-05 11:02 ../
-rw-r--r-- 1 root root 7527 2006-01-04 17:23 BIFFwriter.php
-rw-r--r-- 1 root root 30399 2006-01-04 17:23 Format.php
-rw-r--r-- 1 root root 66832 2006-01-04 17:23 Parser.php
-rw-r--r-- 1 root root 6380 2006-01-04 17:23 Validator.php
-rw-r--r-- 1 root root 57457 2007-07-28 11:09 Workbook.php
-rw-r--r-- 1 root root 112246 2007-07-29 11:07 Worksheet.php

o [サイト管理]-[サーバ]-[動作環境]の状態

php_extension の curl と xmlrpc がインストールされておらず「チェック」
となっています。それ以外はすべて「OK」となっています。

o 半角を直接書いた場合
first や last を直接書いた場合でも、ファイル中には記入されていませんでした。
念のため数字も試しましたが、同じく記入されませんでした。

o Excelファイルの先頭行
ご推察の通り、すべて「空白」となっております。テキスト形式の場合はすべて
表示されています・・・。

o 気になること
テキスト形式の場合、たとえば以下のように成績がエキスポートされます。

性,名,,,,e-mail@address,-,-,-,-,-,-,-,-,-,-,-,-,85.00,90.00,-,90.00,-,-,90.00,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-

しかし、これを Excel 形式でエキスポートすると、性,名,,,,e-mail@addressまでが
空白となるのは当初からご説明していることですが、加えて、- も空白になっており
ます。もし、Excel 形式でのテキスト形式と同じ内容が入るのであれば、- が Excel
形式の場合でも出力されそうなものですが・・・。
また、評点が Excel 形式の場合は 85.00 が 85 となります。これは、数値だから
.00 の部分が表示されていないだけだと思いますので、特に問題ないと思います。
具体的に、Excel 形式で出力されたファイルを、CSV で保存しなおすと、以下の
ようになります。

,,,,,,,,,,,,,,,,,,85,90,,90,,,90,,,,,,,,,,,,,,,,,

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


Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

 PHPもOfficeも私の環境よりもバージョンの高い物をご使用ですね.

> o 気になること
> テキスト形式の場合、たとえば以下のように成績がエキスポートされます。
>
> 性,名,,,,e-mail@address,-,-,-,-,-,-,-,-,-,-,-,-,85.00,90.00,-,90.00,-,-,90.00,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-

emailアドレスの後の'-'はまだ点数が入っていないのですね.でしたらテキスト形式は問題ないですね.ところが仰るとおり,Excel形式では未評価の項目は'-'がセルに入力されるはずです.それが出力されていないのは妙ですね.

 それと,半角英数文字で姓名の欄を強制的に出力させても何も出力されないのも奇妙です.


 変であること.何が変なのか.一つだけ判別が付いた気がする事柄があります.先ほどまでは”日本語を含む文字列がExcelに出力されない”と私は解釈していたのですが,emailアドレスと'-'もExcelに出力されない,これが鍵です.仮説としては,”数字はExcelに出力されるが文字列は一切出力されない”.どうですか,そういう現象ですよね,これは.

 ソースファイルを読むと,文字列は,

 $myxls->write_string($i,0,$user->firstname);

のようにwrite_string()を使って出力,数字は,

$myxls->write_number($i,$j++,$gradestr);

のようにwrite_number()を使って出力している.

 問題の核はこの二つの関数メンバの中身の違いにあるのではないでしょうか.

ちょっと見てみよう.

Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

write_string(), write_number()ともに,lib/excellib.class.phpの中にあります.

    function write_string($row, $col, $str, $format=null) {
    /// Calculate the internal PEAR format
        $format = $this->MoodleExcelFormat2PearExcelFormat($format);
    /// Loading the textlib singleton instance. We are going to need it.
        $textlib = textlib_get_instance();
    /// Convert the text from its original encoding to UTF-16LE
        if (!$this->latin_output) { /// Only if don't want to use latin (win1252) stronger output
            $str = $textlib->convert($str, 'utf-8', 'utf-16le');

        } else { /// else, convert to latin (win1252)
            $str = $textlib->convert($str, 'utf-8', 'windows-1252');
        }
    /// Add the string safely to the PEAR Worksheet
        $this->pear_excel_worksheet->writeString($row, $col, $str, $format);
    }

    function write_number($row, $col, $num, $format=null) {
    /// Calculate the internal PEAR format
        $format = $this->MoodleExcelFormat2PearExcelFormat($format);
    /// Add  the number safely to the PEAR Worksheet
        $this->pear_excel_worksheet->writeNumber($row, $col, $num, $format);
    }

青い部分は両方共通.赤い部分がwrite_string()固有の部分.特に今回は$latin_outputはfalse (Unicode)なので,'utf-8'から'utf-16le'へ変換されているだけ.ここもそれほど危険な感じはしませんね.そして斜体のところが,pearライブラリを呼びに行っている.うん,ここまでは問題無さそうですね.

 あれ,でもそういえばUnicodeではなくLatinにしたら文字化けしたとはいえ,文字列がExcelに出力されたのですよね.だとすると,UTF-16LEはダメだけれども,Winows-1252ならば出力はされる,ということですよね.もしここで,

            $str = $textlib->convert($str, 'utf-8', 'utf-16le');

が失敗して,$strがnullになるならば,”文字列は一切,出力されない”現象の原因の候補の一つに十分,なりますよ.この一行を,

            $str = mb_convert_encoding($str, 'UTF16-LE', 'UTF-8');

としたらどうです?(textllb->convertとmb_convert_encodingでは変換前と変換後のコード指定が逆)


一応,念のためにlib/excel/Worksheet.phpのwrite_number()とwrite_string()も以下に.なお,列数等のチェック部分は省略してます.

     function write_number($row, $col, $num, $format = 0)
    {
        $record    = 0x0203;                 // Record identifier
        $length    = 0x000E;                 // Number of bytes to follow
        $xf        = $this->_XF($format);    // The cell format
    
        $header    = pack("vv",  $record, $length);
        $data      = pack("vvv", $row, $col, $xf);
        $xl_double = pack("d",   $num);
        if ($this->_byte_order) // if it's Big Endian
        {
            $xl_double = strrev($xl_double);
        }    
        $this->_append($header.$data.$xl_double);
        return(0);
    }
    
    function write_string($row, $col, $str, $format = 0)
    {
        $strlen    = strlen($str);
        $record    = 0x0204;                   // Record identifier
        $length    = 0x0008 + $strlen;         // Bytes to follow
        $xf        = $this->_XF($format);      // The cell format
       
        $str_error = 0;    
        if ($strlen > $this->xls_strmax)  // LABEL must be < 255 chars
        {
            $str       = substr($str, 0, $this->xls_strmax);
            $length    = 0x0008 + $this->xls_strmax;
            $strlen    = $this->xls_strmax;
            $str_error = -3;
        }    
        $header    = pack("vv",   $record, $length);
        $data      = pack("vvvv", $row, $col, $xf, $strlen);
        $this->_append($header.$data.$str);
        return($str_error);
    }

こちらこそ,あまり大きな違いは無いですね.環境に依存する関数を呼んでいる感じはありません.

Tatsuya Shirai への返信

あー,原因はiconvではないですか,もしかして

- Tatsuya Shirai の投稿

 そういえば,fs_moodleは奥村先生の指摘にしたがって(メール本文の「~」が消えてしまう問題),lib/textlib.class.phpの文頭のコードを変更して,iconvよりもmbstringを優先的に使用するように改造してあります.ですので,fs_moodleと三重大学版ではiconvは実質的に使用されていないのだと思います.

 もし,textlib->convertではなく,mb_convert_encodingでうまくいくようでしたら,ここが根本的な違いです!

 lib/textlib.class.phpの文頭を以下のように修正してみて下さい.

/// Required files
    require_once($CFG->libdir.'/typo3/class.t3lib_cs.php');
    require_once($CFG->libdir.'/typo3/class.t3lib_div.php');

/// If ICONV is available, lets Typo3 library use it for convert
// (Shirai008): ここからコメントアウト
//
  if (extension_loaded('iconv')) {
//      $GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_convMethod'] = 'iconv';
//  /// Else if mbstring is available, lets Typo3 library use it
//  } else if (extension_loaded('mbstring')) {
//      $GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_convMethod'] = 'mbstring';
// (Shirai008): ここから追加
    if (extension_loaded('mbstring')) {
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_convMethod'] = 'mbstring';
    /// Else if ICONV is available, lets Typo3 library use it
    } else if (extension_loaded('iconv')) {
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_convMethod'] = 'iconv';
// (Shirai008): ここまで追加
    /// Else if recode is available, lets Typo3 library use it
    } else if (extension_loaded('recode')) {
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_convMethod'] = 'recode';
    } else {
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_convMethod'] = '';
    }

iconvに何か根本的なバグがある,という話は聞いていませんが,mbstringを使うことで文字コードの変換に関しては特に問題なしです.
とはいえ,Wikipediaによると,"XML処理用ライブラリ(libxml)に必要である"とありますので,iconvをインストールしないで構わない,という訳にはいかないようですが.

 

Tatsuya Shirai への返信

Re: あー,原因はiconvではないですか,もしかして

- Seiichirou Hiraoka の投稿
iconv及びmbstringについて、phpinfoで確認したところ、以下のようになって
おりました。
もしかして、この設定(php.ini)に問題があるということでしょうか・・・。

iconv
iconv support enabled
iconv implementation unknown
iconv library version unknown

Directive Local Value Master Value
iconv.input_encoding ISO-8859-1 ISO-8859-1
iconv.internal_encoding ISO-8859-1 ISO-8859-1
iconv.output_encoding ISO-8859-1 ISO-8859-1


mbstring
Multibyte Support enabled
Multibyte string engine libmbfl
HTTP input encoding translation enabled
Multibyte (japanese) regex support enabled
Multibyte regex (oniguruma) version 4.4.4
Multibyte regex (oniguruma) backtrack check On

mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.

Directive Local Value Master Value
mbstring.detect_order ASCII,JIS,EUC-JP,SJIS,UTF-8 ASCII,JIS,EUC-JP,SJIS,UTF-8
mbstring.encoding_translation On On
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output EUC-JP EUC-JP
mbstring.internal_encoding no value no value
mbstring.language neutral neutral
mbstring.script_encoding no value no value
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value
Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
平岡です。

$str = $textlib->convert($str, 'utf-8', 'utf-16le');

$str = mb_convert_encoding($str, 'UTF16-LE', 'UTF-8');

に変更してみましたが、同じく「空白」となりました。

Excelエンコーディングを latin にした状態で出力された Excel ファイルを
CSV形式で保存して、先ほどと同じ個所を確認したところ、以下のようになって
おりました。

??,??,,,,e-mail@address,-,-,-,-,-,-,-,-,-,-,-,-,85,90,-,90,-,-,90,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-

つまり、Excelに出力する機能自体は問題ないが、文字コードの変換部分で
問題があって、$strが NULL になっているということですね・・・。

これは困りました・・・・。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

すみません! ハイフン入れる場所を間違えました(さらに言うと手元でチェックをしませんでした).

$str = mb_convert_encoding($str, 'UTF-16LE', 'UTF-8');

です!

 ちなみにエラー出力はどのように設定されているでしょうか?

 もしエラー出力をNONEにしているならば,[サイト管理]-[サーバ]-[デバッグ]の”デバッグメッセージ”をNORMAL以上にしてチェックして下さい.
(チェックが終わったらNONEに戻し忘れないように気を付けて下さい)

Tatsuya Shirai への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
うまくいきました!!!

やはりiconvの問題だったということですか・・・。
現在、サーバにはiconv 1.11を導入しておりますが、1.12がリリースされている
ようですので、試しに更新してみます。

もしそれでうまくいかないようであれば、先ほど教えていただきましたように
ソースを修正して(mbstringを優先)しのごうと思います。

なお、エラーはMINIMALとなっておりましたので、今後デバッグ時には
NORMAL以上に設定しようと思います。

白井先生、長々とどうもありがとうございました。

Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

おめでとうございます! とても他人事とは思えないくらいに嬉しいです^^).

 いやぁ,予想外の箇所でしたね.

 ただ,当方の環境では先のtextlib.class.phpの修正を元に戻しても問題が発生しません.つまり当方で使用しているiconvでは特に問題が発生していません.

iconv
iconv support enabled
iconv implementation unknown
iconv library version unknown

Directive Local Value Master Value
iconv.input_encoding ISO-8859-1 ISO-8859-1
iconv.internal_encoding ISO-8859-1 ISO-8859-1
iconv.output_encoding ISO-8859-1 ISO-8859-1

この二つのunknownが気になります.当方の環境(WindowsXP SP3)では,それぞれ,"libiconv" と 1.9 です.

 本当にiconvが機能しているのかを確認された方が良さそうです.

#でもLatinの場合は ? が出力されるのですよね...全く動いていない訳ではないというのも不思議な感じです.

Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
iconvのバージョンを最新の1.12に更新しても結果は同じでした。
# ftp://ftp.gnu.org/gnu/libiconv/から取得

現在の試験環境は先ほど書かせていただきました Solaris ですが、
実際の運用環境は RHEL4 となっております。Solaris と RHEL4 で
phpinfo の iconv 部分がどのように違うのかについて比較しました。

- Solaris
iconv support enabled
iconv implementation unknown
iconv library version unknown

- RHEL4
iconv support enabled
iconv implementation glibc
iconv library version 2.3.4

このように、結果が違っておりました。このため、運用系の RHEL4 で
あれば、iconv の問題による誤動作はないことが考えられます。
# もし誤動作した際には追記いたします。

このたびは大変長々とご助力いただき、どうもありがとうございました。
# 今後、動作試験は同じ環境で実施したいと思います・・・・。m(__)m
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Haruhiko Okumura の投稿
いずれにしてもiconvは使わないほうがいいです。
三重大版では使わないようにしてあります(白井先生のものもそうなっているはずです)。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Seiichirou Hiraoka の投稿
RHEL4で1.8.2+から1.9.2+への移行試験を行ったところ、何の問題もなく
成功しました。これにより、受験者名が表示されない問題は Solaris に
導入した iconvによるものであることがはっきりしました。

また、奥村先生からもコメントをいただきましたが、iconv には問題がある
ようですので、使わないようにしようと思います。

以上、このたびはどうもありがとうございました。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Haruhiko Okumura の投稿
iconvに問題があるというのも何なのですが,日本のUnicodeは必ずしも理想的な形で運用されてきたわけではないので(その原因がUnicode側の問題かどうかはさておき),iconvでは日本人にとって常識的におかしいことが起こる可能性があります(Windowsで書いた「〜」がISO-2022-JPのメール配信で消えるとか)。

こんなことを言ってもなかなか英語圏の人にわかってもらえないのが白井先生や三重大版の改良が本家にマージされない理由だろうと思います。別の例としては,DoCoMoでピリオドが@の直前に付くメールアドレスが使われていると言っても,そんなものは間違いだからMoodleではサポートしないと言われているようです。
Seiichirou Hiraoka への返信

Re: 小テストの評定のダウンロードについて(1.8.2+以上)

- Tatsuya Shirai の投稿

ちなみに,再確認です.
Excelエンコーディング: Unicodeで行なっていますよね?

 これがLatinだと,出力されるExcelファイル形式が日本語版Excelとは微妙に異なる形式になります.半角英数字しか含まないデータであれば問題ないのですが,マルチバイト文字列をデータとして扱えないファイル形式ですので文字化け(空白ではないと思う)するか,ファイルが破損している,というエラーが出力されると思います.