本家版のマルチバイト関連の問題の累積的修正を行うプラグイン

142 views
Skip to first unread message

tenpura

unread,
Nov 8, 2007, 10:35:19 AM11/8/07
to WordPress 日本語版作成チーム
本家版 WordPress のマルチバイト文字の取り扱いに関する問題の
累積的修正を行うパッチプラグインを作りました。
http://eastcoder.com/code/wp-multibyte-patch

主な機能:

* ISO-2022-JP でメール送信
* トラックバック受信文字が破壊されるバグの修正
* ピンバック受信のマルチバイト対応化
* EXCERPT 系関数のマルチバイト対応化
* 全角スペースで AND 検索
* アドミンエリアの日本語向けフォント調整

上記には日本語特化機能も含まれておりますが、全言語共通の
いくつかの機能は最終的に本体にマージされるべき内容だと考えております。
よろしければ使用時の感想など頂けると助かります。

tenpura

tai

unread,
Nov 9, 2007, 8:11:32 PM11/9/07
to wp-j...@googlegroups.com
tenpuraさん、ありがとうございます!

以下、分かる範囲でテストしましたのでお知らせします。

環境:
ホスティング: dreamhost.com
PHP 5.2.2
MySQL 5.0.24a
WordPress 2.3.1

--メール送信--

* ISO-2022-JP(JIS) 7bit の標準的日本語メールを送信するようになる [ja]
  →使用しているメールアプリはGmailで表示はUTF-8なのですが、ヘッダがISO-2022-JPになっているのを確認しました。また本文に文字化けはありませんでした。

* PHPMailer により MIME ヘッダが破壊される問題を修正する [ja]
  →てっきりMiyoshiさんの「メールの件名の文字化け防止パッチの実証プラグイン※」と同じ機能だと思っていたのですが、違うのでしょうか?有効後も件名の一部文字化けは直りませんでした。
こんな感じです。
『モデレートしてくださ�$: "わーどぷれす"』

http://ideasilo.wordpress.com/2007/09/10/demo-4457/

--トラックバック受信とピンバック受信--

バグの再現方法が分からなかったので不明です。
簡単な再現方法がありましたら、テストしますので教えてください。

--EXCERPT 系関数--

* マルチバイト文字列が適切な位置で切断されない問題を修正する
* 出力文字列の長さを設定ファイルからコントロールできるようになる

 →両方ともオッケーです!ありがとうございます!

--検索--

* 全角スペースでも AND 検索となる [ja]
* 重複するスペースを取り除く機能を付加 [ja]

  →こちらも両方ともオッケーでした。

アドミンエリア

* アドミンページのヘッダ部に独自 CSS コードを出力する機能を付加 [ja]
* 日本語のフォント表示を考慮し上記機能を用いてフォントファミリーを sans-serif 系に統一、一部文字サイズを調整 [ja]

 →Macだと気づかなかったんですが、Winだと見やすくなったと感じました。

その他

* 機種依存文字の文字化け対策の強化 [ja]
* 日本語圏以外のユーザー用途にも対応できるようロケール別に拡張クラス(エクステンション)をロードする機能が組み込まれている

 →機種依存文字は再現方法が分からないので不明です。

以上です。

Thanks again!

--
Tai
tek...@gmail.com

Takayuki Miyoshi

unread,
Nov 9, 2007, 10:06:32 PM11/9/07
to wp-j...@googlegroups.com
すばらしい。

まだ実際に動かす時間がとれないのですが、いまコードをながめてみています。


 * PHPMailer により MIME ヘッダが破壊される問題を修正する [ja]
→てっきりMiyoshiさんの「メールの件名の文字化け防止パッチの実証プラグイン※」と同じ機能だと思っていたのですが、違うのでしょうか?有効後も件名の一部文字化けは直りませんでした。
こんな感じです。
『モデレートしてくださ�$: "わーどぷれす"』

僕の demo-4457 (「メールの件名の文字化け防止パッチの実証プラグイン」) は Subject ヘッダが長い場合の行分割処理を補正します。また、UTF-8 のヘッダのみ対象とし(ほかはそのままスルー)、UTF-8 で出力します。

tenpura さんの wp-multibyte-patch ではヘッダを mb_encode_mimeheader() を使って ISO-2022-JP にエンコードしてます(ext/default/class.php の wp_mail())。mb_encode_mimeheader() なら行分割処理まで正しく行ってくれますから、WordPress 本体にあるヘッダ行分割まわりのバグ[*1]の解決も含んでいることになるはずです。

[*1] http://trac.wordpress.org/ticket/4457

ですので、wp-multibyte-patch を使っている場合にさらに demo-4457 を入れる必要はありません。

ふたつとも入れた場合にバッティングする可能性について考えてみたのですが、wp-multibyte-patch の処理が先に行われた場合は CharSet が ISO-2022-JP に設定され demo-4457 がスルーするのでバッティングしないはずです。demo-4457 の処理が先に行われた場合はなにかおかしなことになるかもしれません(まだよくわかりませんが)。

**

あともうひとつ気がついたことがあるんですが、mb_encode_mimeheader() の行末オプションに "\r\n" を指定されていて、メールの標準仕様上はこれで正しいと思うんですが、日本の XREA なるホスティングサーバではなにやらおかしな実装が行われているらしく、ヘッダ行内の "\r\n" を "\r\n\r\n" に変換してしまうようなんです[*2]。

[*2] http://ideasilo.wordpress.com/2007/05/19/nippon2-11-release/

で、すると連続した改行で空白行ができてしまい、そこがヘッダの終了とみなされてしまうので、その続きのヘッダ行が本文として表示されるというひどいことになってしまいます。

XREA が直せばいいだけの話なんですが XREA ユーザはまだだれも XREA にこの件報告してないようなので、XREA ユーザから上に書いたような事例の報告があるかもしれません。そのときは思い出してみてください。

miyoshi


07/11/10 に tai < tek...@gmail.com> さんは書きました:

tenpura

unread,
Nov 10, 2007, 12:28:26 AM11/10/07
to WordPress 日本語版作成チーム
taiさん、感謝です。面倒な検証に付き合ってくださって本当に助かります。

> * PHPMailer により MIME ヘッダが破壊される問題を修正する [ja]
> →てっきりMiyoshiさんの「メールの件名の文字化け防止パッチの実証プラグイン※」
> と同じ機能だと思っていたのですが、違うのでしょうか?有効後も件名の一部文字化けは直りませんでした。
> こんな感じです。

> 『モデレートしてくださ?$: "わーどぷれす"』
> ※ http://ideasilo.wordpress.com/2007/09/10/demo-4457/

Miyoshiさんのものとはアプローチがだいぶ異なります。
以下もし可能ならお願いできますでしょうか?すみませんです。

1. Miyoshiさんのプラグインが無効になっていることの確認
2. もし件名のみ化けているのだとしたら以下のソース改変を試す
(mb_encode_mimeheader()にバグがあるPHPのバージョンが存在する為)

/wp-multibyte-patch/ext/default/class.php 97行目の
$phpmailer->Subject = mb_encode_mimeheader($phpmailer->Subject,
'ISO-2022-JP' , 'B', "\r\n");

$phpmailer->Subject = $this->encode_mimeheader_b_uncut($phpmailer-
>Subject, 'ISO-2022-JP');
に置き換える

3. 生のメールファイルのソースを送って頂く
(ヘッダ部分のみで良いのですが改行コード、文字コードも含めて確認したい)

> --トラックバック受信とピンバック受信--
> バグの再現方法が分からなかったので不明です。
> 簡単な再現方法がありましたら、テストしますので教えてください。

2.0系を EUC-JP 設定でインストールしてトラックバックとピンバックを打つのがてっとり早いですが
それでも結構面倒だと思いますのでこれは出来たらで構いません。
とりあえず有効化した状態で通常通りトラックバックとピンバックは受信できておりますでしょうか?

---

Miyoshiさん、ありがとうございます。

> demo-4457

同じ hook を使ってますし兼用は駄目ですね。注意事項に付け足しました。
http://eastcoder.com/code/wp-multibyte-patch/

> mb_encode_mimeheader()

バグのあるPHPのバージョンがいくつかあるらしいですね。
やはり自作で分割部分を作った方がいいのかな...
base64エンコードして分割しないという encode_mimeheader_b_uncut() なる
RFC違反承知の関数を使っていますが、念のため説明するとこれは
$phpmailer->FromName が PHPMailer 内部で addslash されるロジックを通って
改行がおかしなことになってしまうからです。
$phpmailer->Subject はそのロジックを通らないので、mb_encode_mimeheader()
を使ってみたのですが、バグのあるサーバーが多いのなら使うのはやめた方が
良いかもしれませんね。XREAのはまた別な問題なのでしょうか。

蛇足ながら XREA 問題は、encode_mimeheader_b_uncut() で解決しそうですね。
Google グループですら一行400文字以上の行のあるヘッダのメールを
送ってきたりしますから少しくらい長くても怒る人はいないと思うんですよ。

tenpura


On 11月10日, 午後12:06, "Takayuki Miyoshi" <takayukis...@gmail.com> wrote:
> すばらしい。
>
> まだ実際に動かす時間がとれないのですが、いまコードをながめてみています。
>
> * PHPMailer により MIME ヘッダが破壊される問題を修正する [ja]
>
>
>
> > →てっきりMiyoshiさんの「メールの件名の文字化け防止パッチの実証プラグイン※」と同じ機能だと思っていたのですが、違うのでしょうか?有効後も件名の一部文字化けは直りませんでした。
> > こんな感じです。

> > 『モデレートしてくださ?$: "わーどぷれす"』

> > 『モデレートしてくださ?$: "わーどぷれす"』

tenpura

unread,
Nov 10, 2007, 12:40:21 AM11/10/07
to wp-j...@googlegroups.com
書き忘れました。

>  →機種依存文字は再現方法が分からないので不明です。

とか

とか
使った文字列の処理で化ける、あるいはマッピングがおかしいことがあったと思います。
再現環境によると思いますので何か気づきましたら教えてください。

tenpura

tenpura

unread,
Nov 11, 2007, 3:51:27 AM11/11/07
to WordPress 日本語版作成チーム
Miyoshi さん

PHP マニュアル mail
http://jp.php.net/manual/ja/function.mail.php
に改行に関する沢山の情報がありました。

> 注意: メッセージが受信されなかった場合には、LF(\n)のみを使ってみてください。
> Unix の MTA の中には、自動的に LF を CRLF に変換してしまう ものがあります
>(もし CRLF を利用していた場合、CR が重複してしまいます)。
> ただし、これは最後の手段です。というのも、これは ≫ RFC 2822 に違反しているからです。

XREAの問題はこれでしょうか。つまり
\r\n が \r\r\n になってしまうと。
ユーザーのコメントを見ると様々な情報が交錯していて頭が痛いです。

tenpura


Takayuki Miyoshi のメッセージ:


> すばらしい。
>
> まだ実際に動かす時間がとれないのですが、いまコードをながめてみています。
>
> * PHPMailer により MIME ヘッダが破壊される問題を修正する [ja]
> >
> > →てっきりMiyoshiさんの「メールの件名の文字化け防止パッチの実証プラグイン※」と同じ機能だと思っていたのですが、違うのでしょうか?有効後も件名の一部文字化けは直りませんでした。
> > こんな感じです。

> > 『モデレートしてくださ?$: "わーどぷれす"』

tai

unread,
Nov 11, 2007, 6:00:38 AM11/11/07
to wp-j...@googlegroups.com
こんばんは、taiです。

> 1. Miyoshiさんのプラグインが無効になっていることの確認
 無効になってます :-)。

> 2. もし件名のみ化けているのだとしたら以下のソース改変を試す
> (mb_encode_mimeheader()にバグがあるPHPのバージョンが存在する為)
>
> /wp-multibyte-patch/ext/default/class.php 97行目の
> $phpmailer->Subject = mb_encode_mimeheader($phpmailer->Subject,
> 'ISO-2022-JP' , 'B', "\r\n");
> を
> $phpmailer->Subject = $this->encode_mimeheader_b_uncut($phpmailer-
> >Subject, 'ISO-2022-JP');
> に置き換える

指示通りソースを改変後、文字化けが無くなりました。
ということは、PHPのバグなのですねorz。

> 3. 生のメールファイルのソースを送って頂く
> (ヘッダ部分のみで良いのですが改行コード、文字コードも含めて確認したい)

PHPのバグということが判明したようなのですが、必要であればあらためて直メールしますので、お知らせください。

> 2.0系を EUC-JP 設定でインストールしてトラックバックとピンバックを打つのがてっとり早いですが
> それでも結構面倒だと思いますのでこれは出来たらで構いません。
> とりあえず有効化した状態で通常通りトラックバックとピンバックは受信できておりますでしょうか?

EUC-JP 設定の2.0系はまた今度設置して試してみます。
有効化した状態でのトラックバックとピンバックは正常に受信できました。

Multibyte Patchを有効状態と無効状態にして丸一記号をコメントしてみましたが、
両方の状態とも正常に表示されました。
Macだと丸1記号はエクスクラメーションマークで表示されるようなのですが、
これも両方とも同じように表示されました。


--
Tai
tek...@gmail.com

Naoko McCracken

unread,
Nov 11, 2007, 10:31:07 PM11/11/07
to wp-j...@googlegroups.com
Tempuraさん、プラグインをどうもありがとうございます。
遅くなりましたが、私もテストしてみました。
すみません、諸事情によりローカルでのテストのみしかできず、また、US版OSのため、多くの方の状況と違うところがあるかもしれません。少しでもご参考になれば幸いです。

環境:
PHP/5.2.3
MySQL/5.0.41
2.3.1 WP日本語版
他プラグインは全て無効

Mac OSX 10.4 Firefox 2.0日本語版から、こちらのページの文字をコメント本文にコピペして投稿してみました。
http://ja.wikipedia.org/wiki/利用者:Suisui/機種依存文字テスト

コメント通知メールについて
1. taiさんのおっしゃっていたような件名の文字化けは私の場合、なかったです。
[mywp] モデレートしてください: "Hello world!"
となりました(コード編集なし)。
2. 本文のスクリーンショットをお送りします。
Gmailで一部はきちんと表示されていました(symbols_gmail.png)。
Mac Mailは残念ながらかなり文字化けが…(symbols_macmail.png)。ちなみに、普通に機種依存文字を本文に書いてメール送信した場合は、文字化けしていませんでした。

実際のコメント表示はcomment.pngのとおりです。ほぼきちんと通っているようですが、一部□になってしまったり、機種依存文字が半角英数字に変換されたり(例:
FAX)しているようです。

以上、コメント周辺のみのテスト結果です。


--
*-=-*-=-*-=-*-=-*-=-*-=-*-=-*=-*-=-*
Naoko McCracken
http://nao-net.com/
Skype: nao_detlog
MSN: naokomc...@hotmail.com

symbols_gmail.png
symbols_macmail.png
comment.png

tenpura

unread,
Nov 14, 2007, 11:33:59 AM11/14/07
to WordPress 日本語版作成チーム
taiさん

> 指示通りソースを改変後、文字化けが無くなりました。
> ということは、PHPのバグなのですねorz。

恐らくPHPのバグか前述のMTAのバグであると思います。
フィードバックを頂いた分のコードは組み込まさせて頂きました。
ありがとうございます。
結果が出ましたのでメールのソースは送って頂く必要はありません。


Naoさん

マックの機種依存文字情報非常に役に立ちました。
ISO-2022-JP-MSというMS拡張のJISで全部まかなえるかと思ったら甘かったですね。
おかげで色々勉強になりました。
メール部分を大幅に作り変えたものをアップしましたのでよろしかったら
お時間がある時にまた試してみてください。
http://eastcoder.com/code/wp-multibyte-patch/

tenpura

Reply all
Reply to author
Forward
0 new messages