PHP中的imap_open()不处理UTF-8

时间:2015-06-04 17:52:12

标签: php encoding utf-8 imap

我正在使用PHP imap函数来读取接收UTF-8编码的纯文本电子邮件(由另一台服务器生成)的邮箱。重音字符替换为问号(?)。下面是我的代码,以下是修复它的两次尝试。我该如何解决这个问题?我无法控制生成消息的服务器,但他们声称它们是UTF-8编码的。 mb_detect_encoding说imap_body函数返回一个ASCII字符串,但我发现mb_detect_encoding在过去有些错误。

 public class Main{
     public static void main(String[] args) {

      myFirstTest  myfirst = new myFirstTest();
      myfirst.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      myfirst.setSize(400,400);
      myfirst.setVisible(true);

}

我尝试了以下转换为UTF-8,即使消息已经是UTF-8:

$connection = imap_open( '{localhost:993/ssl/novalidate-cert}INBOX', 'xxxxxxx', 'xxxxxxx', 0, 1 );
$result = imap_search( $connection, 'UNSEEN' );
if ( $result )
    {
    foreach ( $result as $msgno )
        {
        $body = imap_body( $connection, $msgno );

        // ... (code to process the message) ...

        imap_mail_move( $connection, "$msgno:$msgno", 'INBOX.processed' );
        }

    imap_expunge( $connection );
    imap_close( $connection );
        }
    }

我也尝试过:

$current_encoding = mb_detect_encoding( $body, 'auto' ); // Returns "ASCII"
$body = mb_convert_encoding( $body, $current_encoding, 'UTF-8' );

2 个答案:

答案 0 :(得分:0)

以下是解决方案:我抓住了生成电子邮件的人员,他们进行了以下标题更改:

Content-type: text/html; charset=UTF-8
Content-transfer-encoding: quoted-printable

解决了它。我的PHP程序现在可以看到UTF-8字符。

答案 1 :(得分:0)

获取电子邮件正文后

useByteArray

使用下面的代码

解码消息正文
$body = imap_body( $connection, $msgno );

对$ subject使用相同的逻辑..

有关详细信息,请参阅imap_utf8