【问题标题】:IMAP Encoding and decoding: UTF-8 issueIMAP 编码和解码:UTF-8 问题
【发布时间】:2013-03-26 06:54:38
【问题描述】:

我有一个功能,旨在将邮件从一个文件夹移动到 gmail 帐户上的另一个文件夹。 该功能在移动邮件时功能齐全。我的问题出现在什么时候 使用 utf-8 编码的邮箱。我解码 IMAP 文件夹列表响应 但是两个值的转储会给出不同的结果。

// 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!";

我不知道为什么这两个字符串不匹配,这是我的问题。

【问题讨论】:

  • 打印两者的bin2hex()。还有,你为什么用utf8_encode
  • 我正在使用utf8_encode() 将其格式化以供查看。尝试了不同编码的 dosins,这是唯一以正确格式返回邮箱的方法。关于bin2hex() 函数,两者的返回值如下: IMAP Mailbox = string(24) "5400c3a673746200c3a56b73" Serach_for = string(20) "54c3a6737462c3a56b73" 所以它们仍然不匹配
  • 但它只是从 ISO-8859-1 转换为 UTF-8。如果您的输入不是 ISO-8859-1,那么它将失败,如您所见。
  • 是的,但至少你可以看到为什么它们不匹配,第一个有 2 个NULs
  • 我明白你的意思,但我如何让它们匹配?

标签: php encoding utf-8 imap


【解决方案1】:

PHP 的函数imap_utf7_decode($folder)documented 以ISO-8859-1 编码返回一个字符串。鉴于 IMAP 修改后的 UTF-7 方案可以编码整个 Unicode 范围(这意味着“很多”)并且 ISO-8859-1 只能表示 256 个单独的字符,因此您不可能在这种情况下使用该功能。我什至会建议,决定提供这种无用功能的 PHP 开发人员在设计它的那天并没有处于最佳状态。

看起来 mbstring 扩展可以做你真正想做的事情——使用类似 $mailbox = mb_convert_encoding($folder, "UTF-8", "UTF7-IMAP") 的东西,正如 PHP 文档下方的 cmets 中所建议的那样。

【讨论】:

  • +1 帮助我。我拿了你的代码并稍微改变了它,它对我有用......这是我的代码来帮助下一个人mb_convert_encoding($msg, "UTF-8", "auto");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2010-10-09
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多