日付の文字化けについ て(解決)

日付の文字化けについ て(解決)

- Takahiro Kagoya の投稿
返信数: 2

MoodleをWindows上に設置して数ヶ月間、あきらめかけてた日付文字の文字化けが解決しましたので、報告させていただきます。
今後同様の環境でのサイト構築を考えられる方の参考にしていただけたら幸いです。


(これまでの問題点)

  1. MoodleサイトをWindowsで構築した場合、日付(特に曜日や月名)が文字化けしたり英語表記になる。
  2. Webサーバーは、Apache、IISともに起こる。
  3. localeの設定をja_JP.EUCにしたり、空欄にしても起こる。
  4. カレンダーブロックのpopupcationの日付も化ける。
  5. いろいろなモジュールにて日付を指定する際、月を指定するオプションメニューが化けたり、英語表記になる。


(試行錯誤したこと)

  1. 日付の書式については、lang/ja/moodle.phpで、strftime* というキーワードで設定されている。
  2. strftime* のキーワードは最終的に、PHPのstrftime()関数に渡される。
  3. strftime()関数は、setlocale()に依存している。(%Aや%a、%Bや%b、%p)
  4. Moodleでは、管理画面の詳細設定で、localeを指定するようになっているので、ここをLinuxなどではja_JP.EUCとするが、Windowsの場合このlocaleは正しくない。
  5. いろいろ調べた結果、Windowsの既定のlocaleは、Japanese_Japan.932であると分かる。
  6. これを指定していないときは、曜日や月名が英語表記となる。
  7. localeに Japanese_Japan.932を指定すると、これはSJISで返すようなので、曜日や月名が含まれるところが文字化けする。
  8. いろいろ調べた結果、WindowsでのEUCコードページは、Japanese_Japan.20932であることが分かる。
  9. そこで、localeに、Japanese_Japan.20932を指定するが、やはり曜日等が化ける。(これであきらめかけた)
  10. moodle/lib/setup.php を確認したところ、setlocale(LC_TIME,$cfg->locale)が正しく指定されている。(もう絶望的...)


(解決方法)

  1. localeに、Japanese_Japan.20932と指定する。
  2. moodle/lib/setup.php の235行付近の setlocale(LC_TIME,$cfg->locale)の前に、setlocale(LC_ALL,$cfg->locale)を入れる。

分かってしまえば、簡単な話でしたが、これで数ヶ月間困ってましたので、本当にすっきりしました。
それで、LC_ALLの指定が抜けている理由が分かりません。もしかするとLC_TIMEの指定があるから、本来いらないのでしょうか?
LC_ALLを入れ忘れているバグだとしたら、本家で対応して欲しいと思います。


Takahiro Kagoya への返信

Re: 日付の文字化けについ て(解決)

- Takahiro Kagoya の投稿

かなり古い記事への自己フォローですが...

lib/moodlelib.php で定義されている moodle_setlocale関数にて、LC_ALLを入れたら解決した...ということでしたが、実はいろいろ試していたら、LC_CTYPEの設定がLC_TIMEとかよりも前で設定されているだけで良いようです。従って、現在のソースを

    if ($CFG->locale != 'tr_TR') {            // To workaround a well-known PHP bug with Turkish
        setlocale (LC_CTYPE, $CFG->locale);
    }

    setlocale (LC_TIME, $CFG->locale);
    setlocale (LC_COLLATE, $CFG->locale);

と数行分の順番を入れ替えるだけで、LC_ALLを入れなくても良いようです。 この現象がWindows特有なものなのかどうかまだ検証できていませんが、簡単なことなので、CVSで対応してもらいたいです。以前武本先生に投稿していただいた、bug1619 にコメントしておきました。