2012-11-16 25 views
4

我試圖編碼→(右箭頭,→或Unicode 2192十六進制)到電子郵件主題行。UTF-8字符編碼的電子郵件標題用PHP

當我使用PHP的mb_encode_mimeheader()我得到一個不同的值,當我做雷鳥或Gmail同樣的事情。但是當php生成的電子郵件到達時,字符不能正確顯示。此外,PHP的mb_decode_mimeheader()適用於PHP的輸出,但不適用於解碼來自其他電子郵件源的內容。

通過一個十六進制轉儲的方式,我已經計算出的箭頭的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的編碼,雷鳥和Gmail出來爲:A

我完全被PHP的行爲困惑,因爲它似乎沒有產生標準的結果。

我怎樣才能讓PHP編碼UTF-8電子郵件標頭值,這樣它會通過郵件客戶端正確解碼?

+0

utf8_encode($ variable)..http://php.net/manual/en/function.utf8-encode.php – Dinesh

+0

@Dinesh字符串是*已經UTF-8編碼的*,你不需要'utf8_encode'。 – deceze

+0

相關:從PHP電子郵件打破Subject頭編碼(http://stackoverflow.com/q/4389676/2157640) – Palec

回答

8

似乎還有就是忽略了第二個參數的錯誤,我得到正確的結果,當我添加內部編碼:

<?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?= 
+0

謝謝!我剛剛得到了這個。似乎倒退了,必須爲整個子系統設置內部編碼,僅用於一個字符串。我已經採取了存儲原始值,將其改爲所需值,然後再次恢復原始值以保證安全! – artfulrobot

+0

@artfulrobot true,但爲什麼你會使用除utf-8以外的其他內部編碼:P – Esailija

+0

好吧'mb_encode_mimeheader()'對於在多行中分割長標題和添加縮進非常有用。所以它對於簡單的ASCII標頭也很有用。好一點,雖然,我也許應該爲它停留在拉美更新我的默認爲UTF-8 1 – artfulrobot