2013-04-04 219 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