转换内联指定的UTF-8邮件主题

hbi*_*bit 4 php email encoding utf-8

想要将以下原始邮件转换为正常的UTF-8文本:

=?utf-8?Q?Schuker_hat_sich_vom_ = C3 = 9Cbungsabend_(01.01.2012)_abgem?= =?utf-8?Q?eldet?=

真正的文字是:

Schuker hat sichvomÜbungsabend(01.01.2012)abgemeldet

我的第一种转换方法:

$mime = '=?utf-8?Q?Schuker_hat_sich_vom_=C3=9Cbungsabend_(01.01.2012)_abgem?=  =?utf-8?Q?eldet?=';
mb_internal_encoding("UTF-8");
echo mb_decode_mimeheader($mime);
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:

Schuker_hat_sich_vom_Übungsabend_(01.01.2012)_abgemeldet

(这里的问题:我做错了什么?为什么会出现这些下划线?)

我的第二种转换方法:

$mime = '=?utf-8?Q?Schuker_hat_sich_vom_=C3=9Cbungsabend_(01.01.2012)_abgem?=  =?utf-8?Q?eldet?=';
echo imap_utf8($mime);
Run Code Online (Sandbox Code Playgroud)

这给了我以下(正确)结果:

Schuker hat sichvomÜbungsabend(01.01.2012)abgemeldet

为什么这样做?我应该依靠哪种方法?

我问的原因是我以前曾要求另一个邮件主题解码相关的问题在哪里mb_decode_mimeheader解决方案,而这里imap_utf8将是要走的路.我怎样才能确保为这两个示例解码所有正确的内容:

=?utf-8?Q?Schuker_hat_sich_vom_ = C3 = 9Cbungsabend_(01.01.2012)_abgem?= =?utf-8?Q?eldet?

=?UTF-8?B?UmU6ICMyLUZpbmFsIEFjY2VwdGFuY2UgdGVzdCB3aXRoIG5ldyB0ZXh0IHdpdGggU2xvdg ==?= =?UTF-8?B?YWsgaW50ZXJwdW5jdGlvbnMgIivEvsWhxI3FpcW + w73DocOtw6khxYgi?=

应该给我预期的结果:

Schuker hat sichvomÜbungsabend(01.01.2012)abgemeldet

回复:#2 - 最终验收测试,带有斯洛伐克语中间节点的新文本"+ľščťžýáíé!"

Gab*_*dez 7

基于hbit响应,我改进了imapUtf8()使用charset信息将主题文本转换为UTF-8的功能.结果如下:

function imapUtf8($str){
    $convStr = '';
    $subLines = preg_split('/[\r\n]+/', $str);
    for ($i=0; $i < count($subLines); $i++) {
        $convLine = '';
        $linePartArr = imap_mime_header_decode($subLines[$i]);
        for ($j=0; $j < count($linePartArr); $j++) {
            if ($linePartArr[$j]->charset === 'default') {
                if ($linePartArr[$j]->text != " ") {
                    $convLine .= ($linePartArr[$j]->text);
                }
            } else {
                $convLine .= iconv($linePartArr[$j]->charset, 'UTF-8', $linePartArr[$j]->text);
            }
        }
        $convStr .= $convLine;
    }

    return $convStr;
}
Run Code Online (Sandbox Code Playgroud)