[Tep-j-develop] mb_encode_mimeheader() default encoding

Back to archive index

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*****>





Tep-j-develop メーリングリストの案内
Back to archive index