2013-04-04 71 views
1

我有一個函數,用於將郵件從一個文件夾移動到另一個gmail賬戶上。 該功能在移動郵件時功能完整。我的問題出現在使用utf-8編碼郵箱的 。我解碼IMAP文件夾列表響應 但兩個值的轉儲給出不同的結果。IMAP編碼和解碼:UTF-8問題

// Getting the folders 
$folders = imap_list(CONNECTION, MAILBOX, PATTERN); 

// After a foreach, stripping slash, prefix and such 
// $folder is the raw mailbox name from the IMAP list 
$mailbox = utf8_encode(imap_utf7_decode($folder)); // = string(12) "Tæstbåks" 

// The entered search from the client 
$search_for = "Tæstbåks"; // = string(10) "Tæstbåks" 

if($search_for == $mailbox) 
    print "Yeah!"; 
else 
    print "Noo!"; 

我不知道爲什麼那兩個字符串不匹配,那是我的問題。

+0

打印兩者的'bin2hex()'。另外,你爲什麼使用'utf8_encode'? – Esailija 2013-04-04 09:29:37

+0

我正在使用'utf8_encode()'將其格式設置爲正確的查看。嘗試了不同編碼的dosins,這是唯一一種以正確的格式返回郵箱的方法。 關於'BIN2HEX()'函數兩者的返回值如下: IMAP郵箱=字符串(24) 「5400c3a673746200c3a56b73」 Serach_for =字符串(20) 「54c3a6737462c3a56b73」 因此,他們依舊不匹配 – 2013-04-04 09:45:50

+0

但它只是從ISO-8859-1轉換爲UTF-8。如果您的輸入不是ISO-8859-1,那麼它會失敗,如您所見。 – Esailija 2013-04-04 09:48:09

回答

4

PHP的函數​​是documented返回一個ISO-8859-1編碼的字符串。鑑於IMAP的經過修改的UTF-7方案可以對Unicode的整個範圍進行編碼(這意味着「很多」),並且ISO-8859-1只能表示256個單獨的字符,所以在這種情況下您不可能使用該功能。我會盡可能地建議那些決定提供這種無用功能的PHP開發人員在他設計它的那一天沒有達到最佳狀態。

它看起來像mbstring擴展可以做你真正想在這裏做的 - 使用像$mailbox = mb_convert_encoding($folder, "UTF-8", "UTF7-IMAP")這樣的東西,如PHP的文檔下面的評論中所建議的。

+0

+1幫助我。我把你的代碼稍微修改了一下,它從我這裏工作...這裏是我的代碼來幫助下一個人'mb_convert_encoding($ msg,「UTF-8」,「auto」);'' – Jaylen 2015-03-16 17:48:11