4

→→ (右矢印、または Unicode 2192 hex) を電子メールの件名にエンコードしようとしています。

PHP を使用するmb_encode_mimeheader()と、Thunderbird や Gmail で同じことを行う場合とは異なる値が得られます。しかし、phpで生成されたメールが届くと、文字が正しく表示されません。また、PHP は PHPmb_decode_mimeheader()からの出力に対して機能しますが、他の電子メール ソースからのコンテンツをデコードすることはありません。

16進ダンプを介して、矢印のUTF-8表現が

<?php
$rarr = "\xe2\x86\x92";

mb_encode_mimeheader($rarr, 'UTF-8'); //     =?UTF-8?B?w6LChsKS?=
// whereas Tbird and Gmail produce:          =?UTF-8?B?4oaS?=
// and more manually:
'=?UTF-8?B?' . base64_encode($rarr).'?='; // =?UTF-8?B?4oaS?=

PHP のエンコーディングは、Thunderbird と Gmail では次のようになります。

標準的な結果を生成していないように見えるため、PHP の動作に完全に混乱しています。

PHP で UTF-8 メール ヘッダー値をエンコードして、メール クライアントで適切にデコードされるようにするにはどうすればよいですか?

4

1 に答える 1

8

2番目のパラメーターを無視するバグがあるようです。内部エンコーディングを追加すると、正しい結果が得られます。

<?php
$rarr = "\xe2\x86\x92";
mb_internal_encoding( "UTF-8");
echo mb_encode_mimeheader($rarr, 'UTF-8'); //=?UTF-8?B?4oaS?=

だが

<?php
$rarr = "\xe2\x86\x92";

mb_encode_mimeheader($rarr, 'UTF-8'); //=?UTF-8?B?w6LChsKS?=

内部エンコーディングを設定するだけで十分です。

<?php
$rarr = "\xe2\x86\x92";
mb_internal_encoding( "UTF-8");
echo mb_encode_mimeheader($rarr); //=?UTF-8?B?4oaS?=
于 2012-11-16T12:00:40.963 に答える