Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿
返信数: 24

 まだ調査中です.

 Moodle1.9.5+(2009/06/02以降)でフォーラム投稿の通知メールが文字化けするとの報告を受けました.私はダイジェストメール,しかも題名のみなので気付きませんでした.先週の金曜日にMoodleをアップデートしてから発生しているようです.


Re: 配信メールの文字化け
2009年 06月 8日(月曜日) 10:59 - 白井 達也 の投稿
---------------------------------------------------------------------


???????¨??????±??????

????§????Gmail??¢????????????????????????????????????????¨????????????????????±?????¨????????????´???????????????????????§????????§????????°????????????????????????

---------------------------------------------------------------------
これは ウェブサイト ROB_PRJ_ALL に投稿された記事のコピーです。


このように,投稿本文のみが文字化けして届きます.当初はGmailユーザのみから報告があったので,Gmailとの相性の問題かと思ったのですが,通常のPC向けのメールでも同現象の発生を確認しました.

 まだまだ原因は分かりませんが,もしかしたらlib/weblib.phpの以下の更新が影響しているのかも知れません.雰囲気としては,本文の内容によって化けたり化けなかったりしています.



lib/weblib.phpの変更箇所:

function html_to_text($html) {

    global $CFG;

    require_once($CFG->libdir .'/html2text.php');

    $h2t = new html2text($html);
    $result = $h2t->get_text();

    // html2text does not fix HTML entities so handle those here.
    $result = html_entity_decode($result, ENT_NOQUOTES, 'UTF-8');

    return $result;
}

この赤い箇所が先週の公開版で削除されました.

 他にも同様の現象を確認した方はいらっしゃらないでしょうか.

これからlib/forum/lib.phpのfunction forum_cron()あたりから追いかけてみます.

Tatsuya Shirai への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿

ああ,繋がっていますね.

lib/forum/lib.phpのfunction forum_cron()の後半部,

     $posttext .= "\n".$strbynameondate."\n";
    $posttext .= "---------------------------------------------------------------------\n";
    $posttext .= format_text_email(trusttext_strip($post->message), $post->format);
    $posttext .= "\n\n";

function format_text_email()はlib/weblib.phpの中にあります.$post->formatはHTMLエディタを使った場合は(予想ですが)"FORMAT_HTML"だと思います.

lib/weblib.phpのfunction format_text_email()を全文抜き出すと,

function format_text_email($text, $format) {

    switch ($format) {

        case FORMAT_PLAIN:
            return $text;
            break;

        case FORMAT_WIKI:
            $text = wiki_to_html($text);
        /// This expression turns links into something nice in a text format. (Russell Jungwirth)
        /// From: http://php.net/manual/en/function.eregi-replace.php and simplified
            $text = eregi_replace('(<a [^<]*href=["|\']?([^ "\']*)["|\']?[^>]*>([^<]*)</a>)','\\3 [ \\2 ]', $text);
            return strtr(strip_tags($text), array_flip(get_html_translation_table(HTML_ENTITIES)));
            break;

        case FORMAT_HTML:
            return html_to_text($text);
            break;

        case FORMAT_MOODLE:
        case FORMAT_MARKDOWN:
        default:
            $text = eregi_replace('(<a [^<]*href=["|\']?([^ "\']*)["|\']?[^>]*>([^<]*)</a>)','\\3 [ \\2 ]', $text);
            return strtr(strip_tags($text), array_flip(get_html_translation_table(HTML_ENTITIES)));
            break;
    }
}

ここですね.これで変更のあったfunction html_to_text()をコールしますね.


ちなみに,lib/html2text.phpは大きく変更されています.html_entity_decode($result, ENT_NOQUOTES, 'UTF-8');を削除したことがいけないのか,それともhtml2text.phpの修正が悪いのか,その判断はまだできません.html2text.phpは正規表現を多用しているので理解に時間が掛かります.

Tatsuya Shirai への返信

lib/html2text.phpに原因がある

- Tatsuya Shirai の投稿

require_once('config.php');

$html = "<p> Gmail以外へのメールでも文字化けが発生することを確認しました.</p>
<p> さらに先週末の本家Moodleの更新箇所に,大きく関わりのありそうな箇所を発見しました.ラテンな方々には我々,マルチバイト言語圏のことはあまり見えていないので困りますね.ちょっと調査してみます.</p>
<p> 修正のあった箇所を元に戻せば文字化けは多分,収まると思いますが,しばらくは原因調査のためにこのままにしておいて良いでしょうか.</p>
<p> 文字化けが発生するかしないか,は,フォーラム投稿の中身がHTMLフォーマットで記入されたか,それともテキストフォーマットで記入されたかによります.後者は化けません.前者のHTMLフォーマットからテキスト形式への変換において文字化けが発生しています.したがって,メール受信の形式をHTML形式にすれば,もしかしたら一時的に収まるかも知れません.</p>";

    global $CFG;

    require_once($CFG->libdir .'/html2text.php');

    $h2t = new html2text($html);
    $result = $h2t->get_text();

echo $result;

このようなサンプルのスクリプトを実行したら化けました.    $result = html_entity_decode($result, ENT_NOQUOTES, 'UTF-8'); は関係無さそうです.これを追加しても化けたままです.

代わりに,lib/html2text.phpを一つ古いリビジョンにダウンして上記スクリプトを実行したら文字化けしませんでした.これは...結構,影響の多い関数ですよ.

 原因がハッキリするまでは2009/06/02版のMoodle1.9.5+(Moodle1.8.9+も?)にアップデートするのは待った方が良いでしょう.


 ちなみにlib/html2text.phpにはUTF-8では無い文字データが混入していました.222行あたりの// Euro signというコメントの後です.これが悪さをしているのかと思ったのですが,このコメントを削除しても状況は変わりませんでした.

Tatsuya Shirai への返信

Re: lib/html2text.phpに原因がある

- Tatsuya Shirai の投稿

function _convert()の

     function _convert()
    {
        // Variables used for building the link list
        $this->_link_count = 0;
        $this->_link_list = '';

        $text = trim(stripslashes($this->html));

 // Convert <PRE>
        $this->_convert_pre($text);

        // Run our defined search-and-replace
        $text = preg_replace($this->search, $this->replace, $text);
        $text = preg_replace_callback($this->callback_search, array(&$this, '_preg_callback'), $text);

        // Replace known html entities
        $text = utf8_encode(html_entity_decode($text));

        // Remove unknown/unhandled entities (this cannot be done in search-and-replace block)
        $text = preg_replace('/&[^&;]+;/i', '', $text);

        // Strip any other HTML tags
        $text = strip_tags($text, $this->allowed_tags);

        // Bring down number of empty lines to 2 max
        $text = preg_replace("/\n\s+\n/", "\n\n", $text);
        $text = preg_replace("/[\n]{3,}/", "\n\n", $text);

この青い箇所は,元々は

        $text = preg_replace_callback($this->callback_search, array('html2text', '_preg_callback'), $text);

の一行でした.この部分だけを元に戻せば文字化けが発生しません.何が原因でしょう.どなたかヘルプ!(私も考えますが...)

Tatsuya Shirai への返信

utf8_encode — ISO-8859-1 文字列を UTF-8 にエンコードする

- Tatsuya Shirai の投稿

判明しました.意外とアッサリと.

    function _convert()
    {
        // Variables used for building the link list
        $this->_link_count = 0;
        $this->_link_list = '';

        $text = trim(stripslashes($this->html));

        // Convert <PRE>
        $this->_convert_pre($text);

        // Run our defined search-and-replace
        $text = preg_replace($this->search, $this->replace, $text);
        $text = preg_replace_callback($this->callback_search, array(&$this, '_preg_callback'), $text);

        // Replace known html entities
//      $text = utf8_encode(html_entity_decode($text));
        $text = html_entity_decode($text, ENT_COMPAT, 'UTF-8');

        // Remove unknown/unhandled entities (this cannot be done in search-and-replace block)
        $text = preg_replace('/&[^&;]+;/i', '', $text);

これです.このように修正したら化けません.html_entity_decode()の第二引数を省略した場合はENT_COMPATですので,そのようにしました.UTF-8に変換するのにutf8_encode()を使用していますが,これはタイトルにも書きましたように,LATIN文字(ISO-8859-1)をUTF-8に変換する関数ですので,$textに含まれるUTF-8のマルチバイト文字列は全て化けます.LATIN語圏でも悪影響があるはずです.


lib/html2text_readme.txtの初っ端に,こんなことが書いてありますね.

Modifications
--------------

1- fix for these warnings in cron:

  "html_entity_decode bug - cannot yet handle MBCS in html_entity_decode()!"

by using this code:

  utf8_encode(html_entity_decode($string));

instead of:

  html_entity_decode($string, ENT_COMPAT, 'UTF-8');

(see http://nz.php.net/manual/en/function.html-entity-decode.php#89483)

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

Re: utf8_encode — ISO-8859-1 文字列を UTF-8 にエンコードする

- Tatsuya Shirai の投稿
 見当違いかも知れませんが,直近のChange logを読むとこの箇所の修正はMDL-19266に基づいて行われたように読めますので,こちらにコメントしました.
Tatsuya Shirai への返信

Re: utf8_encode — ISO-8859-1 文字列を UTF-8 にエンコードする

- Tatsuya Shirai の投稿

 でも,なぜわざわざUTF-8に変換するのでしょうか.

 Moodle上のデータはUTF-8ですし,言語パックの翻訳結果もUTF-8.ですから$textはUTF-8だと思うのだけれども.もしかしたらmbstringの設定によってはhtml_entity_decode()によってEUC->UTF-8のような変換が行われてしまうのではないかと心配です.

 サーバのエラーや外部プログラムのエラーなどは各サーバ上の設定によって色々とあるのかも知れませんが.mb_convert_encoding()を使った方が良いのかな.html_entity_decode()がPHPのバージョンによってUTF-8の2バイト目以降に対応していないのが原因のように書かれています.だとしたら今回の私が示した方法は不適切です(とはいえ5月末まではこのコードだったのですが).

Tatsuya Shirai への返信

Re: utf8_encode — ISO-8859-1 文字列を UTF-8 にエンコードする

- K Yukawa の投稿

クイックメール修正の際、mbstringを何も設定していない私の環境では変換前の文字コードはISO-8859-1でした笑顔

K Yukawa への返信

Re: utf8_encode — ISO-8859-1 文字列を UTF-8 にエンコードする

- Tatsuya Shirai の投稿

 な,なるほど.レアな例ですが効果はあったのですね.

 とりあえずUTF-8の$textをUTF-8に変換することに問題が発生しないのであれば,転ばぬ先の杖と考えて良さそうですね.

Tatsuya Shirai への返信

fs_moodle3.13.02を公開しました

- Tatsuya Shirai の投稿

 html2text.phpの問題を独自に解決したfs_moodle3.12.02を公開しました

 fs_moodle3.12.01の公開は停止していましたが,もしダウンロードしてしまった方は速やかにこちらのバージョンにアップデートして下さい.この問題はMoodle1.8.9+, Moodle1.9.5+双方において発生する問題です.

 

Tatsuya Shirai への返信

Re: fs_moodle3.13.02を公開しました

- Haruhiko Okumura の投稿
こちらもたいへん出遅れてしまいました。すみません。

新しいhtml2textの大きなバグが白井先生のおかげで直ったわけですが,この新しいバージョンはうちのようにセンターの事情でPHP4で動作させなければならない場合に生じる微妙なバグを修正してくれたという点でうれしいものです。じつはときどき生じるメールの紛失の原因の一つがこれだったということがだんだんわかってきました。私のようにテキストで書き込む場合にはまったく問題ないのですが,リッチテキストエディタを使ってできたHTMLをメールのテキストに変換する際に再現性のあるエラーが起きていました(多分 <a ...> タグが原因)。

ということで三重大学版もhtml2textを新しくして白井先生のfixを入れたものに差し替えました。
Tatsuya Shirai への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Toshihiro KITA の投稿
>Moodle1.9.5+(2009/06/02以降)でフォーラム投稿の通知メールが文字化けするとの報告を受けました.

moodle.org からのフォーラム投稿の通知メールが,6月12日午後以降,本文が文字化けするようになりました。(題名やフッタの部分はちゃんと読めます。)

同じ原因でしょうか。
Toshihiro KITA への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿

 題名のみの受信ですので気付きませんでした.それはそうですね,ここもmoodleですし...

#どなたか,Using moodleへ報告お願いします^^;

Tatsuya Shirai への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿

 他力本願はよろしくありませんので,Tracker に報告しました(MDLSITE-763).

Tatsuya Shirai への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Haruhiko Okumura の投稿
以前も箇条書きなどが入るとApple Mailでは必ず化けていました。箇条書きのマーク(ブレット)が非アスキー文字になっていたためで,これは三重大学版では * などに直したと思います。今回もそれだろうと思っていましたが,必ず化けるようになっていたのですね。

実は現状でもHTMLメールにすれば化けないので,今はそうしています。
Haruhiko Okumura への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿
試しにタイトルだけではなく本文も送るように設定を変更したら,確かにJapanese Moodleの投稿分は顕著に化けますね.Using moodleも一部,化けます.

Trackerの方では早速,反応があり,

Assignee: Eloy Lafuente (stronk7) (was: Helen Foster)

となりました.近日中に状況が変化すると良いですね.

Tatsuya Shirai への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Toshihiro KITA の投稿
本家への報告どうもありがとうございます。

不思議なのは,投稿者によって文字化けしたりしなかったりすることです。
私と奥村先生とIchihashiさんの投稿は,12日以降も文字化けしていません。

共通点は,ひょっとして,Firefox を使っていることでしょうか? その他の人(メールだと文字化けする投稿)は IE を使っているとか?
Toshihiro KITA への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Haruhiko Okumura の投稿
標準のWebフォームを使っていればhtml2text.phpは使われないので問題ないということかもしれませんね。
Haruhiko Okumura への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿
そうですね、HTMLエディタを用いるか否か、ですね。
いま私はSafariから書き込んでいますので、HTMLエディタ不使用です。これは化けずに届くと思います。

あれ、でも強調!のような事をするとどうなるのでしょうか。
(Bタグを手入力しました)
Haruhiko Okumura への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Toshihiro KITA の投稿
> 標準のWebフォームを使っていれば

あ,そうです。私はHTMLAREA は使っていません。
(Moodleオートフォーマットで書き込んでいます。)

そういうことですね。なるほど。

Toshihiro KITA への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿

 一応,Closedになったようです.

 さぁ,正しく届くでしょうか?(CVSの方のみ訂正?)

Tatsuya Shirai への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
白井先生がTrackerに報告されたときのMoodle開発者の対応、凄く早いですね。笑顔

Mitsuhiro Yoshida への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿

 いや本当に,とても週末とは思えない反応で感動しました.

 でも,Closedですが,化けますね^^;

Tatsuya Shirai への返信

Re: Moodle1.9(2009/06/02以降)でフォーラム投稿の通知メールが文字化け

- Tatsuya Shirai の投稿


2009-06-15 Monday 13:38  fmarier

* lib/: html2text.php, html2text_readme.txt:

MDL-2794: fix html2text handling of non-ASCII characters


これでしょうか.

 大量のUsing moodleからのメールが届くので,要約メール(題名のみ)に戻しましたので,分かりません.moodle.orgも直りましたか?