Mineaki Gotoh
gij****@peak*****
2003年 3月 5日 (水) 09:18:50 JST
田邊さん、こんにちは。後藤です。朝早くからお疲れさまです。 >> 思うに、田邊さんのところでは、mbstring.language が未設定なのではない >> でしょうか。 >> >おっしゃる通りです。というか、敢えて php.ini も .htaccess にも >register_globals On 以外は何も書いていません。マニュアルにも mbstring >の設定に付いての記述は無いようですし、mbstringの入っていないようなサー >バーにも jcode.phps で対応しているくらいですから、mbstringの設定がない >状態でも動いた方が良いのではないか、と思うわけです。 それはそれで正しい設計思想かもしれませんね。 ただ、php.ini がなければ、すべてのphpが同じオプションで動作するか、と いうとちょっと違って、configure時のオプション次第でphp.iniなし時のデ フォルト設定が決まるものもあります。 環境による影響はどうやっても消せないので、一般的なphp.iniについては設 定しておいた方が良いと思っています。 >勿論、 >> mbstring.language = Japanese >を php.ini に書け、とマニュアルに書いておけば良い事なのかもしれないで >すが。 これに関しては、osCommerceのマニュアルというより、phpのマニュアルに書 いておいて欲しいところですね。4.3.0 に上げて、この部分でハマった人は 数多いと思います。(私もそうです) mbstring.language については、catalog側・admin側の.htaccessに記述する のが良いと思っています。 mb_internal_encoding()の直前に、mb_language()で設定するのでも良いかも しれませんが、マニュアルを読んだり、簡単な動作確認をした限りでは、な んとなく無関係っぽいので。 今回の話とは関係ありませんが、mbstring.http_input についても、 .htaccessに記述すべき項目かもしれません。 それと、別ツリーですが、 > 上記スクリプトでもそうでしたが、長いとおかしくなってしまうようですね。 > From:, To: についても同じように思えますが、どうなんでしょうか? > > 長いと、mb_encode_mimeheader() を通した時に、途中でブツ切りされたよう > な状態になってしまうようです。ちゃんとくっつけてやれば良さそうな感じも > するのですけど、$bの例では mb_decode_mimeheader() を通すと途中から化け > てしまいます。 mb_encode_mimeheader() は、ヘッダフィールド用のエンコードに変換する関 数です。 ですから、RFCの規定にあるfoldingを行います。75文字程度を基準としてい るようです。 もちろん、RFC822に準拠したMUAであれば、unfolding処理もきちんと行いま すので、Subject:やFrom:,To:が長くて、途中に"\r\n "が入ったものでもき ちんと処理してくれます。事実、うちのショップでは、私の書いたコードを そのまま使っていますが、長いSubjectでも文字化けしたことは一度もありま せん。(12/08修正分については、むしろそれこそがRFC違反なので、採用して いません) 途中でブツ切りになったわけではなく、むしろ親切でそうしてくれていると 解釈しています。(RFCを読むまでは、私もこの仕様に ??? でしたが) 田邊さんの、mb_encode_mimeheader.php においても、base64_decodeする前 に、MIMEヘッダ処理の義務である、unfoldingを行えば、ちゃんと元の文字列 になるはずですよ。(もちろん、あのコードでは単純にそうなるわけではあ りませんが) ただ、RFC822を読む限り、folding自体はmustではないようですから、 '=?ISO-2022-JP?B?' . base64_encode(mb_convert_encoding($str, 'JIS', 'EUC')) . '?=' という単純な処理でも良いかもしれませんね。 もっとも、別のRFCにMIMEヘッダの上限が255byte、みたいな規定があっても おかしくはないですし、長すぎるヘッダを変な位置で勝手にfoldingするMTA や、ヘッダ処理のためのバッファを256byte分しか取っていないMUAがないと いう保証はないですね。だから、私が書くならやはりmb_encode_mimeheader を使うと思います。 -- 株式会社PEAK ネットワーク技術担当 後藤 <gij****@peak*****>