moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿
返信数: 48

まったく活用されていないことをいいことに,moodle1.7.1+からmoodle1.8へアップグレードを行ないました.

OS: Windows XP SP2

やはりカレンダー等の年月日が化けます.
/moodle/lib/moodlelib.phpに,
http://moodle.org/mod/forum/discuss.php?d=48755
で紹介されているパッチを当ててみようと思ってソースを見てみたところ,なんと,既に改善されているようです! でも化けます悲しい

見よう見まねで直してみたところ,一応,うまく行きました.
function userdate($date, $format='', $timezone=99, $fixday = true) の最後尾です.
--------<ここから>-----
Blue: Original
Red: Modified

/// If we are running under Windows convert from windows encoding to UTF-8
/// (because it's impossible to specify UTF-8 to fetch locale info in Win32)

$localewincharset = null; // ADD
$textlib = null; // ADD

if ($CFG->ostype == 'WINDOWS') {
if ($localewincharset = get_string('localewincharset')) {
$textlib = textlib_get_instance();
$datestring = $textlib->convert($datestring, current_charset(), $localewincharset);// MODIFY
}
}
if ($localewincharset) { //ADD
$datestring = $textlib->convert($datestring, $localewincharset, current_charset()); // ADD
} // ADD
return $datestring;
}
------<ここまで>------
オリジナルでは,
$datestring = $textlib->convert($datestring, $localewincharset, 'utf-8'); // ORIGINAL
となっていたところを
$datestring = $textlib->convert($datestring, current_charset(), $localewincharset);// MODIFY
と修正したのが最も重要な点だとは思います.

何となく正しく動いているようですが,このような修正で良かったのでしょうか.

P.S. moodle1.7.1+では,Global Searchを有効にして検索を行なうとApacheが異常終了します.”単体テスト”は総合テストの実行が完了しません.統計資料も”このコースおよび期間の組み合わせデータはありません。”といって何もグラフが表示されません.これらの問題が解決されるかと思ってmoodle1.8にアップグレードしたのですが,当方の環境ではどれも解決しませんでした悲しい

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿
この修正(moodle1.8用)は不完全です赤面

年月日は正しく表示されますが,曜日が化けます.(カレンダーでは問題なし)
Windows環境で,こちらにある問題が生じるはずです.
http://moodle.org/mod/forum/discuss.php?d=70528#p316463

和田さんが
http://moodle.org/mod/forum/discuss.php?d=48755&parent=251134
で示された回避策を正しく理解していませんでした.
具体的には,$formatの変換を端折っています.

正しい修正方法は未解決です.時間を下さい.あるいは解決済みの方,お助け下さい.


Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿
一人で大騒ぎして申し訳ありません.解決したようです.
和田さんの意見を理解して,応用させていただいた結果,以下のコードで正しいはずです.
昨日は$formatnodayの変換を行なっていなかったため,どうしてもうまく行かなかったのですが,今朝,頭をクリアにして行なったところ解決しました.
moodle_setlocale()あたりを疑ったりと,色々寄り道しましたが,これで大丈夫でしょう.

moodle1.8のmoodle/lib/moodlelib.phpのuserdate()関数です.
function userdate($date, $format='', $timezone=99, $fixday = true) {

global $CFG;

if (empty($format)) {
$format = get_string('strftimedaydatetime');
}

if (!empty($CFG->nofixday)) { // Config.php can force %d not to be fixed.
$fixday = false;
} else if ($fixday) {
$formatnoday = str_replace('%d', 'DD', $format);
$fixday = ($formatnoday != $format);
}

$localewincharset = null;
$textlib = null;
if ($CFG->ostype == 'WINDOWS') {
if ($localewincharset = get_string('localewincharset')) {
$textlib = textlib_get_instance();
$format = $textlib->convert($format, current_charset(), $localewincharset);
$formatnoday = $textlib->convert($formatnoday, current_charset(), $localwincharset);
}
}

$date += dst_offset_on($date);

$timezone = get_user_timezone_offset($timezone);

if (abs($timezone) > 13) { /// Server time
if ($fixday) {
$datestring = strftime($formatnoday, $date);
$daystring = str_replace(' 0', '', strftime(' %d', $date));
$datestring = str_replace('DD', $daystring, $datestring);
} else {
$datestring = strftime($format, $date);
}
} else {
$date += (int)($timezone * 3600);
if ($fixday) {
$datestring = gmstrftime($formatnoday, $date);
$daystring = str_replace(' 0', '', gmstrftime(' %d', $date));
$datestring = str_replace('DD', $daystring, $datestring);
} else {
$datestring = gmstrftime($format, $date);
}
}

/// If we are running under Windows convert from windows encoding to UTF-8
/// (because it's impossible to specify UTF-8 to fetch locale info in Win32)

if ($CFG->ostype == 'WINDOWS') {
// if ($localewincharset = get_string('localewincharset')) {
if ($localewincharset) {
// $textlib = textlib_get_instance();
// $datestring = $textlib->convert($datestring, $localewincharset, 'utf-8');
$datestring = $textlib->convert($datestring, $localewincharset, current_charset());
}
}

return $datestring;
}

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Kensuke Sugiura の投稿

 

Windows 2003 Server, IISでMoodle 1.8+を使っています。年月日の文字化けが解決できずにこまっていました。こちらでもShiraiさんの修正方法で解決しました。ありがとうございます。

Kensuke Sugiura への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿
デバッグ情報をONにしていて気付いたのですが,一箇所,typoミスです.(緑色の箇所).$localwincharsetではなく,$localewincharsetです.eが一箇所抜けています.これでも動くから凄いというのか何と云うのか...

function userdate($date, $format='', $timezone=99, $fixday = true) {

global $CFG;

if (empty($format)) {
$format = get_string('strftimedaydatetime');
}

if (!empty($CFG->nofixday)) { // Config.php can force %d not to be fixed.
$fixday = false;
} else if ($fixday) {
$formatnoday = str_replace('%d', 'DD', $format);
$fixday = ($formatnoday != $format);
}

$localewincharset = null;
$textlib = null;
if ($CFG->ostype == 'WINDOWS') {
if ($localewincharset = get_string('localewincharset')) {
$textlib = textlib_get_instance();
$format = $textlib->convert($format, current_charset(), $localewincharset);
$formatnoday = $textlib->convert($formatnoday, current_charset(), $localewincharset); //ここ.$localではなく,$locale !
}
}

$date += dst_offset_on($date);

$timezone = get_user_timezone_offset($timezone);

if (abs($timezone) > 13) { /// Server time
if ($fixday) {
$datestring = strftime($formatnoday, $date);
$daystring = str_replace(' 0', '', strftime(' %d', $date));
$datestring = str_replace('DD', $daystring, $datestring);
} else {
$datestring = strftime($format, $date);
}
} else {
$date += (int)($timezone * 3600);
if ($fixday) {
$datestring = gmstrftime($formatnoday, $date);
$daystring = str_replace(' 0', '', gmstrftime(' %d', $date));
$datestring = str_replace('DD', $daystring, $datestring);
} else {
$datestring = gmstrftime($format, $date);
}
}

/// If we are running under Windows convert from windows encoding to UTF-8
/// (because it's impossible to specify UTF-8 to fetch locale info in Win32)

if ($CFG->ostype == 'WINDOWS') {
// if ($localewincharset = get_string('localewincharset')) {
if ($localewincharset) {
// $textlib = textlib_get_instance();
// $datestring = $textlib->convert($datestring, $localewincharset, 'utf-8');
$datestring = $textlib->convert($datestring, $localewincharset, current_charset());
}
}

return $datestring;
}

評点平均: お役立ち度: ★★★★★☆☆ (1)
Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 Moodle1.9でも同様の年月日の文字化けが発生していましたが,Moodle1.8とlib/moodlelib.phpのfunction userdate()は同一でした.したがって,以前に示したのと同じ,以下の修正を行うことでWindowsサーバにおける年月日(および曜日)の文字化けは改善します.

function userdate(), 1010行近辺

    if (!empty($CFG->nofixday)) {  // Config.php can force %d not to be fixed.
        $fixday = false;
    } else if ($fixday) {
        $formatnoday = str_replace('%d', 'DD', $format);
        $fixday = ($formatnoday != $format);
    }

// ここから追加
    $localewincharset = null;
    $textlib = null;
    if ($CFG->ostype == 'WINDOWS') {
        if ($localewincharset = get_string('localewincharset')) {
            $textlib = textlib_get_instance();
            $format  = $textlib->convert($format, current_charset(), $localewincharset);
            if (isset($formatnoday)) $formatnoday = $textlib->convert($formatnoday, current_charset(), $localewincharset);
        }
    }
// ここまで追加
    $date += dst_offset_on($date);

    $timezone = get_user_timezone_offset($timezone);

    if (abs($timezone) > 13) {   /// Server time
        if ($fixday) {
            $datestring = strftime($formatnoday, $date);
            $daystring  = str_replace(' 0', '', strftime(' %d', $date));
            $datestring = str_replace('DD', $daystring, $datestring);
        } else {
            $datestring = strftime($format, $date);
        }
    } else {
        $date += (int)($timezone * 3600);
        if ($fixday) {
            $datestring = gmstrftime($formatnoday, $date);
            $daystring  = str_replace(' 0', '', gmstrftime(' %d', $date));
            $datestring = str_replace('DD', $daystring, $datestring);
        } else {
            $datestring = gmstrftime($format, $date);
        }
    }

/// If we are running under Windows convert from windows encoding to UTF-8
/// (because it's impossible to specify UTF-8 to fetch locale info in Win32)

   if ($CFG->ostype == 'WINDOWS') {
// ここからコメントアウト
//     if ($localewincharset = get_string('localewincharset')) {
//         $textlib = textlib_get_instance();
// 以下1行を追加
       if ($localewincharset) {
           $datestring = $textlib->convert($datestring, $localewincharset, 'utf-8');
       }
   }

    return $datestring;
}

 

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 このWindows限定の問題点をTracker (MDL-13389) に報告していたのですが,長期に亘り進展はありませんでした.Calendarの問題として報告したのがいけなかったのかも知れません.

 私の報告よりも詳しいものがでました (MDL-14149).リンクもして貰えましたので,ようやく動きが現れるかも知れません.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Yuuichi Yamaguchi の投稿
白井先生
いつもお世話になっております。
これまでFreeBSDでしかmoodleを利用していませんでしたが,最近,デモ機用にEeePC(windowsXP)にmoodleをインストールしました(MoodleWindowsInstaller-latest-19.zip)。

いまだに
年月日の文字化けとなっておりました。
白井先生がこちらの書き込みに残してくださったとおりにphpスクリプトを書き換えましたら無事に文字化けが解決いたしました。
ありがとうございます。

この箇所は,今後のバージョンも毎回このようにphpスクリプトの書き換えが必要なのでしょうか?
Yuuichi Yamaguchi への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿
未だMoodle2.0を解析する準備と時間が確保できないの、状況が変化したのかどうか分かりません。ただ、この前の前の書き込みにあるように、人からもTrackerへの報告がありました。これを機に本家での対応が進むか?と期待したのですが、あまり進展がありません。
Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
いつもアドバイスありがとうございます.

Moodle 1.95+でも同じように年月日の文字化けが発生します.そこで,上記のMoodle1.9に対する変更と同じものをmoodlelib.phpに行いましたが,依然文字化け状態です.どなたかアドバイスをいただけたらと思います.
T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 当方,特に問題なく表示されています.

 もしかしたらWeb画面から修正箇所をコピー&ペーストする際に,以下の投稿の方のようなことがおきているのかも知れません.
http://moodle.org/mod/forum/discuss.php?d=124555

 まずは一文字一文字,よーく確認してみて下さい.

 次に考えられるのはphp.iniのmbstring系の設定です.内部文字コードなどの文字コード類の指定にEUCなどの設定がありませんか? 基本的にUTF-8です.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
いつもご助言いただきありがとうございます.

文字を確認しましたが問題ありません.また,php.iniのmbstring系の設定でEUCなどの指定はありません.
そこで再度確認したいのですが,白井さんからご指摘のあったように,lib/moodlelib.phpのfunction userdate()の以下の赤い部分を訂正するだけでいいのでしょうか?

何度も申し訳ありませんが.どうぞよろしくお願いいたします.


function userdate(), 1010行近辺

if (!empty($CFG->nofixday)) { // Config.php can force %d not to be fixed.
$fixday = false;
} else if ($fixday) {
$formatnoday = str_replace('%d', 'DD', $format);
$fixday = ($formatnoday != $format);
}

// ここから追加
$localewincharset = null;
$textlib = null;
if ($CFG->ostype == 'WINDOWS') {
if ($localewincharset = get_string('localewincharset')) {
$textlib = textlib_get_instance();
$format = $textlib->convert($format, current_charset(), $localewincharset);
if (isset($formatnoday)) $formatnoday = $textlib->convert($formatnoday, current_charset(), $localewincharset);
}
}
// ここまで追加
$date += dst_offset_on($date);

$timezone = get_user_timezone_offset($timezone);

if (abs($timezone) > 13) { /// Server time
if ($fixday) {
$datestring = strftime($formatnoday, $date);
$daystring = str_replace(' 0', '', strftime(' %d', $date));
$datestring = str_replace('DD', $daystring, $datestring);
} else {
$datestring = strftime($format, $date);
}
} else {
$date += (int)($timezone * 3600);
if ($fixday) {
$datestring = gmstrftime($formatnoday, $date);
$daystring = str_replace(' 0', '', gmstrftime(' %d', $date));
$datestring = str_replace('DD', $daystring, $datestring);
} else {
$datestring = gmstrftime($format, $date);
}
}

/// If we are running under Windows convert from windows encoding to UTF-8
/// (because it's impossible to specify UTF-8 to fetch locale info in Win32)

if ($CFG->ostype == 'WINDOWS') {
// ここからコメントアウト
// if ($localewincharset = get_string('localewincharset')) {
// $textlib = textlib_get_instance();
// 以下1行を追加
if ($localewincharset) {
$datestring = $textlib->convert($datestring, $localewincharset, 'utf-8');
}
}

return $datestring;
}


T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 当方のfunction userdate()を添付します.

 試しにお手元のlib/moodlelib.phpの該当箇所をこちらの添付ファイルの内容で上書きしてみて下さい.(function userdate()だけですよ)


 年月日が文字化けするということはサーバOSに日本語WindowsXP/Vista/Serverをご利用ですね? でしたらfs_moodleのご利用をお勧めします.オリジナルのMoodleでは日本語Windowsの仕様上の制限により日本語のフォルダやファイルを取り扱うことができません.
 ドキュメントの不足,雑多な設定と,改良に改良を重ねた結果,かなり立ち上げに苦労するシステムになってしまいました.この問題は次期リリース予定のfs_moodle4で改善する予定です.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
いろいろとアドバイスしていただきありがとうございます.

ご指示のようにmoodlelib.phpの該当箇所を上書きしましたが依然以下のように表示がおかしい状態です.OSは日本語Windows XPを使用しています.何か他にアドバイスがありましたらありがたいのですが.


2009蟷エ 07譛


T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

phpの設定かも知れません.

どの設定が影響するか確信はありませんが,関係がありそうな箇所を示します.

default_charset = "UTF-8"

[mbstring]

mbstring.language = Japanese
mbstring.internal_encoding = "UTF-8"
mbstring.http_output = "UTF-8"
mbstring.encoding_translation = On

この辺りでしょうか.

php.iniを変更した後はApacheを再起動して下さい.なお,この変更が反映されているかどうかを「サイト管理」-「サーバ」-「PHP情報」で必ず確認してください.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
アドバイスありがとうございます.

下記のように設定を変更し,Apacheを再起動し,「サイト管理」-「サーバ」ー「PHP情報」で確認しましたが依然同じ現象です.何か他にできることがありますでしょうか?どうぞよろしくお願いします.

2009蟷エ 07譛


修正前 修正後

;default_charset = "iso-8859-1" -> default_charset = "UTF-8"

[mbstring]

;mbstring.language = Japanese -> mbstring.language = Japanese
;mbstring.internal_encoding = "ECU-JP" -> mbstring.internal_encoding = "UTF-8"
;mbstring.http_output = "SJIS" -> mbstring.http_output = "UTF-8"
;mbstring.encoding_translation = Off -> mbstring.encoding_translation = On


T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

本件には関係ないと思うのですが,

extension=php_mbstring.dll

のコメントは外れているでしょうか?(mbstringが有効になっているか)

 また,[サイト管理]-[サーバ]-[動作環境]のリストは11項目全てがOKになっているでしょうか?

あと,[サーバ]-[デバッグ]にて,一時的に”デバッグメッセージ”をNORMAL, ALL, DEVELOPPER(後ろに行くほどエラー表示が多くなる)にしてみて下さい.何かエラーメッセージが出力されないでしょうか.

 あと,実はmoodleフォルダが複数存在し,今回修正を行ったのはApacheによって実行される方のソースではなかった,というようなことも無いでしょうか.意図的に先ほど修正したfunction userdate()内にシンタックスエラーを発生させたり,die;を追加して動作が中断されるか,などのチェックも行って下さい.

 さらに,確認しますが,テキスト編集を行ったエディタの種類も教えて下さい.保存する際にきちんとUTF-8形式(BOMなし)で保存されたかどうかも.(これはあまり関係ないと思うのですが,念のために)


default_charset未設定が一番影響ありそうだったんですけれどもねぇ.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
ご連絡ありがとうございます.

ご質問に対する回答は以下の通りです.
お忙しいところ大変申し訳ありませんがよろしくお願いします.

1. extension=php_mbstring.dllは,moodlelib.php内に見当たりませんが,他のファイルでしょうか?

2. [サイト管理]-[サーバ]-[動作環境]のリストは11項目すべてOKです.

3. [サーバ]-[デバッグ]にて,一時的に”デバッグメッセージ”をNORMAL, ALL, DEVELOPPER(後ろに行くほどエラー表示が多くなる)にしてみても特にエラーメッセージは表示されません.

4. 意図的に先ほど修正したfunction userdate()内にdie;を追加すると動作が中断されます.また,検索するとmoodlelib.phpは一つしか見つかりません.

5. テキスト編集を行ったエディタは,秀丸です.






T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
一つ気になることは,アクセスすると最初に英語表示になることです(もちろん,その後で日本語を選択すれば日本語表示になりますが).何か問題と関係がありますでしょうか?

T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

extension=php_mbstring.dll

これはphp.iniの設定ですが,PHP動作環境の11項目が全てOKならば問題ありません.組み込まれているようですね.

 いやしかし不思議ですね...今後の他の方々の参考になりそうですので(失礼^^;),是非とも問題解決しましょう.

 言語の選択はユーザプロファイルで設定して下さい.フロントページでの言語選択はあくまで一時的なものです.ログオフするまでの間のみ有効です.

 とりあえず私はネタ切れです.どなたかヘルプ願います.

#もしお時間があるようでしたら,fs_moodleも試してみて下さい.moodledataやMySQLのデータベースには特殊な操作をほとんど行いませんので,共棲可能です.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
アドバイスありがとうございます.

文字化けが解決しない場合はぜひfs_moodleを試したいと思います.


T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 カレンダーのところに表示される年月日の文字のみ文字化けするのであれば,やはりfunction userdate()以外には現状では考え難いのですよね.依然としてphp.iniの設定の問題(あるいはPHPのバージョン)という線も捨てがたいのですが...何か他に文字関係で不具合が出てくれると問題解決の糸口になると思うのですが,いかんせん,オリジナルのMoodleでは日本語(マルチバイト文字列)の扱いに問題が多く残っているので切り分けが難しい.やはりfs_moodleも併用して他の部分の日本語文字列にどのような問題が生じるのか,から,切り分けないとなりませんね.


よろしければ,moodlelib.phpとphp.iniをzip書庫に圧縮して添付して頂けません? 同じ環境を再現してみたいと思います.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
お忙しい中ありがとうございます.
ご指示のように圧縮ファイルを添付いたしますのでどうぞよろしくお願いいたします.
お手数をおかけし申し訳ありません.




T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 まず,送っていただいたmoodlelib.phpに差し替えても,当方の環境では正しくカレンダーの年月日が表示されました.あとでphp.iniの方も試してみます.まずはご報告のみ.


もしかして「ここが文字化けする」というご指摘の箇所が,当方で確認している箇所と異なる恐れがあります.画面のキャプチャもアップロードして頂けます? (PtrScnボタンでキャプチャ,ペイントなどで編集してjpegファイル)

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
ありがとうございます.

ご依頼のデータを添付いたします.

どうぞよろしくお願いいたします.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
白井先生

カレンダーの文字化けに関して、3年前の投稿ですが、lang/ja_utf8/langconfig.phpの$string['localewincharset']を書き換えるだけでよさそうですね。笑顔

[Moodle1.6の日付表示で文字化け]
http://moodle.org/mod/forum/discuss.php?d=48755

また、カレンダーの文字化けを解決するため、langconfig.phpをShift-JISで保存されている方もいらっしゃいます。

[Windows環境でのMoodle文字化け - sryo's Weblog]
http://joint.aichi-u.ac.jp/mt3/2009/01/07_124418.php
Mitsuhiro Yoshida への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

なるほど.私は前者の和田さんの修正をベースにしています.

もう一つのlangconfig.phpを修正する方法は考えもしませんでした.もしこれでオリジナル通りでOKならば大収穫ですね.あとで調べてみます.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
皆様のアドバイスありがとうございます.

langconfig.phpをShift-JISで保存しましたが残念ながら症状は同じでした.
T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 langconfig.phpは言語パックを更新するたびに書き換えられてしまいますので,(一番シンプルな方法なのですが)逆に手間が掛かります.

 localeの方は,どうでしょう.曜日などが入っていないならば大丈夫そうですが.


php.iniも目に付くような違いはありませんでした.

うーん.そうですねぇ.言語パックのアップデートをしてみます?

サイト管理-「言語設定」-「言語パック」-「利用中のすべての言語パックを更新」

を行ってみて下さい.かなり苦し紛れですが...

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
アドバイスありがとうございます.

言語パックの更新を行うと,「すべての言語パックは最新版です。アップデートの必要はありません。」というメッセージが表示されました.


T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
いつもアドバイスありがとうございます.

カレンダーが日本語で表示されるので問題がおきるということで,
2009蟷エ 07譛
を単に2009 07とする方法はあるのでしょうか?
もしご存知でしたらお教えください.


T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

このままでは不便ですよね.

moodledata/lang/ja_utf8/langconfig.phpの中の,

$string['strftimemonthyear'] = '%%Y年 %%m月 ';

$string['strftimemonthyear'] = '%%Y / %%m ';

とすれば,2009 / 07 のように表示されます.

他にも日付を扱う箇所は沢山あります.このファイル内の全ての日付の日本語文字を半角英数字に置き換えれば当面はしのげるでしょう.

#しかし原因は何なんでしょうね.

今度,オリジナルのMoodleをダウンロードして試してみます.

なお,上記修正は言語パックの更新を行うと上書きされてしまいますので,バックアップを取るか,言語パックを更新するたびに手作業で直す必要があります.Moodleのマイナーなバージョンアップであっても,言語パックが自動的に更新されることもありますので,ご注意下さい.


うーん,オリジナルのMoodleをダウンロードして展開し,config.phpをシステムに合わせて変更しただけの状態ではカレンダーの月日が文字化けすることを確認.そこからfunction userdate()のみを直して症状が改善するのも確認.やはりphpの設定以外は考えにくいですね.

php.iniは複数箇所に存在します.phpのフォルダとApacheのフォルダです.違う方を修正していないですよね,サイト管理で確認されていますからねぇ.Apacheの設定が悪影響を与える可能性はありますかね?

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 色々とこちらでもphp.iniの設定を変えてみたのですが,症状が再現できません.

 実際にはmbstringを使わないでコード変換を行う処理を行っていますので,ここの設定を変えても意味が無いわけですし...本当に不思議な現象ですね.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 試しに添付したtest.phpをmoodleフォルダにコピーして,Webブラウザから実行してみて下さい.http://あなたのサイトのURL/moodle/test.phpという感じで.usergetdate()の表示が化けるのは正しいです.4行目にstring(70) " 2009年 07月 " と表示されればOK.多分,化けてくれるでしょう.これはコース等に配置したカレンダーの年月の部分と同じコードです.

 更に,test.phpの頭の方にある,define('Shirai125', false); のfalseをtrueにして試してみて下さい.関係ないはずなのですが...第3行目は変化します.それは正しい反応です.


Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿
当方の環境で実行した結果です.
Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
多くのアドバイスありがとうございます.

1) langconfig.php内で,日付の日本語文字を半角英数文字にすべてしましたが状況は改善されませんでした.
2) 添付されたtest.phpをwebブラウザから実行しましたが,「Objet not found!」というエラー・メッセージが表示されました.

残念ですがとりあえず現状のままとし,機会がありましたらまた再度挑戦したいと思います.いろいろとご助言いただき大変ありがとうございました.

T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
「サイト管理 > 言語設定 > 言語設定」の設定項目を下記のように変更してください。

言語の自動認識: チェックを外す
デフォルト言語: 日本語 (ja)
言語メニューを表示する: チェックする

Mitsuhiro Yoshida への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- T. Fujino の投稿
アドバイスありがとうございます.

言語設定はご指摘のようになっていますが,依然文字化けが発生します.
T. Fujino への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- KOJI YAMAGUCHI の投稿

山口と申します。

私のところもMoodleを使ってみたいということで
Windowsのall-in-one packagesをダウンロードして
インストールするとカレンダーの文字化けが発生しました。

moodlelib.phpを白井先生の修正通り変更しても文字化けが解消しませんでした。
T. Fujino さんのところとまったく一緒の現象でした。

仕方なく、
WINDOWSパソコンにAPACHE・PHP・MYSQL・Standard Moodle packagesを個別にインストールし、
moodlelib.phpを修正してブラウザ表示すると文字化けが解消しておりました。

いろいろ試行錯誤した結果、all-in-one packagesでインストールされた

PHP.INIの修正を行うとカレンダーの文字化けが解消しました。

修正部分は下記のとおりです。
php.iniの
[eAccelerator]のところをすべてコメントアウトにする


[eAccelerator]
;extension=eaccelerator.dll
;eaccelerator.shm_size = "0"
;eaccelerator.cache_dir = "C:\Moodle\server\tmp"
;eaccelerator.enable = "1"
;eaccelerator.optimizer = "1"
;eaccelerator.debug = "0"
;eaccelerator.check_mtime = "0"
;eaccelerator.filter = ""
;eaccelerator.shm_max = "0"
;eaccelerator.shm_ttl = "0"
;eaccelerator.shm_prune_period = "0"
;eaccelerator.shm_only = "0"
;eaccelerator.compress = "1"
;eaccelerator.compress_level = "9"
;eaccelerator.keys = "shm_and_disk"
;eaccelerator.sessions = "shm_and_disk"
;eaccelerator.content = "shm_and_disk"
;eaccelerator.admin.name =
;eaccelerator.admin.password =


同じ現象が起こっている方の参考になれば幸いです。

KOJI YAMAGUCHI への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 うーん,不思議ですね.

 こちらでは[eAccelerator]を全てコメントアウトしてもカレンダーの*年*月が化けたままですね.

 それともphp.iniの他の部分の設定の違いでしょうかね.

#いつの間にか本家の対応が進んだのかと思って最新版をダウンロードしたのですが,状況は変わっていませんでした.

 一つ調査をお願いできないでしょうか.eAcceleratorのOn/Offで状況が変化するというのも少し気になります.試しにいまの環境でeAcceleratorを有効にして再びカレンダーの文字化けが発生することを確認して頂け無いでしょうか.

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- KOJI YAMAGUCHI の投稿

こちらの環境は下記通りです。
Windows XP SP2、IE6、Moodle 1.9.6(all-in-one packages)

moodlelib.phpは修正済み
[eAccelerator]のON/OFFの件を試してみました。
[eAccelerator]:ON → カレンダ表示 2009蟷エ 11譛
[eAccelerator]:OFF→ カレンダ表示 2009年 11月

こちらの環境では100%再現します。
違いは何でしょうか次のバージョンで修正されていることを期待します。

KOJI YAMAGUCHI への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

 あ!なるほど,安心しました.moodlelib.phpは修正済みでのeAcceleratorのOn/Offですね!修正が不要になったのかと勘違いしていました.

 eAcceleratorの影響をどう受けると言うのでしょう...バージョンの違いに何か影響があるのでしょうか.

 当方,PHP5.2.8です.他のバージョンでも特に不具合は発生しなかったのですが,私が飛ばしたバージョンに何かeAcceleratorに問題があったのでしょうか.(PHPとeAcceleratorはバージョンを合わせる必要があるので).

Tatsuya Shirai への返信

Re: moodle1.8へアップグレード:(やはり)年月日が化ける:暫定的解決策

- Tatsuya Shirai の投稿

http://moodle.org/mod/forum/discuss.php?d=149997#p656478

上記フォーラムで不可思議な現象が発生しており,その原因が check_mtime="0"にあるらしいことが分かってきました.こちらの問題もcheck_mtime = "1"とすることで改善する可能性があります.お試し下さい.

Tatsuya Shirai への返信

新しい(?)解決方法

- Tatsuya Shirai の投稿

 ja_utf8/langconfig.phpをシフトJISで保存する方法というものも広く出回っているようですが,それ以外の方法で解決された方が居るようです.

http://zerohours.justblog.jp/weblog/2009/03/moodle-sqlite.html

 素のMoodle1.9.6+ に上記の2つの修正(CP932->UTF-8,サイト全体のロケールを空からUTF-8)を行ったところ,確かにカレンダーの年月の文字化けが直りました.CP932をUTF-8に変更するだけではフォーラム投稿などの日付の曜日だけ文字化けするのですが,サイト全体のロケールをUTF-8に変更することで,直ります.ただし,日月火ではなく,kSun, Monday, Tuesdayの英語表記になりますが...

 fs_moodleを導入するといった敷居の高い方法を取るのではなく,とりあえず日本語ファイル名が取り扱えなくてもいいからMoodleを日本語Windows上で動かしたい,という要望に対しては良いアプローチのように見えます.


 でも,この方法も日本語言語パックを更新するたびに$string['localewincharset'] = 'UTF-8';に直す作業が必要ですけれども.

 localwincharsetの意味から言うとCP932が正しい訳ですので,これをUTF-8に変更するのは,やはり本質的な解決になっていません.textlib.class.phpでもlocalewincharsetを利用していますので,もしかしたら思わぬところで悪影響が出るかも知れません.
(ただ,思ったほど多くの箇所では使われていないですね)

Tatsuya Shirai への返信

Re: 新しい(?)解決方法

- 鎌田 融彦 の投稿

はじめまして。株式会社インフォプラザの大滝と申します。(鎌田の代理で質問させていただきます)

下記状況なのですが、解決方法をご教示ください。

<環境>

OS:WINDOWS XP SP3

moodle:2.0.2+

 

<状況>

課題の開始日時を始めとして、すべての年月が文字化けしています。

 

<質問事項>

2007年4月5日の質問・回答を見ながら、ソースを書きかえようとしたところ、バージョンの違いからかソースが異なり適用するのを中止いたしました。このバージョンにあった解決方法をご教示ください。

なお、システムに関してはあまり詳しくありませんので、お手数ですがその前提でご回答いただけると助かります。

よろしくお願いします。

鎌田 融彦 への返信

Re: 新しい(?)解決方法

- Hideaki YAMADA の投稿

 根本解決にはなりませんが、以下の方法で症状が緩和されました。
ご参考まで。

<環境>
       OS: Windows VISTA SP2
       DB: SQL Server 2008 Express Edition
moodle:2.2.2+  

<変更箇所>
------ moodlelib.php の userdate関数の末尾
  if ($CFG->ostype == 'WINDOWS') {
// if ($localewincharset = get_string('localewincharset', 'langconfig')) { //DEL
    if ($localewincharset) { // ADD
        $textlib = textlib_get_instance();
        $datestring = $textlib->convert($datestring, $localewincharset, 'utf-8');
    }
  }

return $datestring;

------ 曜日の表示を削除
[マイホーム]-[サイト管理]-[拡張機能]
-[言語設定]-[言語カスタマイゼーション]
(日本語を選択)-[編集のため言語パックを開く]

[フィルタ設定]-[ストリングを表示するコンポーネント]
(langconfig.phpを選択)
ストリング[strftimedaydatetime]を検索

%Y年 %m月 %d日(%A) %H:%M
⇒ %Y年 %m月 %d日 %H:%M ... 曜日の表示を削除

[編集を言語パックに反映する]

Hideaki YAMADA への返信

Re: 新しい(?)解決方法

- Tatsuya Shirai の投稿

 いまはゆっくりとMoodle2.2への対応を進めているところなのですが,いかんせん,Windows用PHP5.3の5C問題があって本格的にWindows環境での検証ができません.

 手元のWikiの記録ですと,こちらの(Shirai001)にあるように,Moodle1.8/1.9/2系統で特に対応の仕方は変わっていないようですが,駄目でしたでしょうか.

Hideaki YAMADA への返信

Re: 新しい(?)解決方法

- Hideaki YAMADA の投稿
 汎用性は全くありませんが、自分の環境に合わせて
userdate関数を強引に改造したものを示します。
--------------------------------------------------------------------------------------------------------
function userdate($date, $format = '', $timezone = 99, $fixday = true) {

if (empty($format)) {
$format = get_string('strftimedaydatetime', 'langconfig');
}

$format = mb_convert_encoding($format, 'CP932', 'utf-8');

//add daylight saving offset for string timezones only, as we can't get dst for
//float values. if timezone is 99 (user default timezone), then try update dst.
if ((99 == $timezone) || !is_numeric($timezone)) {
$date += dst_offset_on($date, $timezone);
}

$timezone = get_user_timezone_offset($timezone);

if (abs($timezone) > 13) { /// Server time
$datestring = strftime($format, $date);
} else {
$date += (int)($timezone * 3600);
$datestring = gmstrftime($format, $date);
}

/// If we are running under Windows convert from windows encoding to UTF-8
/// (because it's impossible to specify UTF-8 to fetch locale info in Win32)

$datestring = mb_convert_encoding($datestring, 'utf-8', 'CP932');

return $datestring;
}
鎌田 融彦 への返信

Re: 新しい(?)解決方法

- Tatsuya Shirai の投稿
4月25日に Yamashita Kouichiさんによって新しくTrackerへのリクエストが出ていますね。このパッチは2.2.2用のようです。参考になるのでは無いでしょうか。 とても大事な問題ですので、是非皆さんもVoteお願いします。 http://tracker.moodle.org/browse/MDL-32632
評点平均: お役立ち度: ★★★★★★★ (1)