Конвертировать встроенную указанную тему почты UTF-8 - PullRequest
4 голосов
/ 19 февраля 2012

хотите преобразовать следующую необработанную почту в обычный текст UTF-8:

=? Utf-8? Q? Schuker_hat_sich_vom_ = C3 = 9Cbungsabend_ (01.01.2012) _abgem? = =? Utf-8? Q? Eldet? =

Реальный текст для этого:

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?=';
mb_internal_encoding("UTF-8");
echo mb_decode_mimeheader($mime);

Это дает мне следующий результат:

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);

Это дает мне следующий (правильный) результат:

Schuker hat sich vom Ü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 sich vom Übungsabend (01.01.2012) abgemeldet

и

Re: # 2-Финальный приемочный тест с новым текстом со словацкими символами "+ ľščťžýáíé! Ň"

Ответы [ 4 ]

7 голосов
/ 02 апреля 2014

Основываясь на ответе hbit , я улучшил функцию imapUtf8() для преобразования текста объекта в 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;
}
1 голос
/ 23 февраля 2012

Эта функция работает для обоих примеров:

function imapUtf8($str){
    $convStr = '';
    $subLines = preg_split('/[\r\n]+/',$str); // split multi-line subjects
    for($i=0; $i < count($subLines); $i++){ // go through lines
        $convLine = '';
        $linePartArr = imap_mime_header_decode(trim($subLines[$i])); // split and decode by charset
        for($j=0; $j < count($linePartArr); $j++){
            $convLine .= ($linePartArr[$j]->text); // append sub-parts of line together
        }
        $convStr .= $convLine; // append to whole subject
    }
    return $convStr; // return converted subject
} 

Тесты:

$sub1 = '=?utf-8?Q?Schuker_hat_sich_vom_=C3=9Cbungsabend_(01.01.2012)_abgem?=  =?utf-8?Q?eldet?=';
$sub2 = '=?UTF-8?B?UmU6ICMyLUZpbmFsIEFjY2VwdGFuY2UgdGVzdCB3aXRoIG5ldyB0ZXh0IHdpdGggU2xvdg==?= =?UTF-8?B?YWsgaW50ZXJwdW5jdGlvbnMgIivEvsWhxI3FpcW+w73DocOtw6khxYgi?=';
echo imapUtf8($sub1);
echo imapUtf8($sub2);

Результат:

Schuker hat sich vom Übungsabend (01.01.2012) abgemeldet

Re: # 2-Финальный приемочный тест с новым текстом со словацкими символами "+ ľščťžýáíé! ň"

1 голос
/ 24 февраля 2012

О загадочном подчеркивании в поле заголовка Subject:

RFC2047 4.2 (2) прямо заявляет:

8-битное шестнадцатеричное значение 20 (например, ISO-8859-1 SPACE) может быть обозначается как «_» (подчеркивание, ASCII 95.). (Этот персонаж может не проходить через некоторые межсетевые почтовые шлюзы, но использовать его значительно улучшит читаемость данных, закодированных в "Q", с почтой читатели, которые не поддерживают эту кодировку.) Обратите внимание, что "_" всегда представляет шестнадцатеричное 20, даже если символ ПРОБЕЛ занимает другую позицию кода в используемом наборе символов.

Правило кодирования для строки темы задокументировано в самом RFC2047.

1 голос
/ 23 февраля 2012

Это также в комментариях в руководстве для mb_decode_mimeheader, и я на самом деле предполагаю, что это ошибка. Нет в базе данных, поэтому я бы подал ее как новую.

Однако AFAIK imap_mime_header_decode справится с обеими вашими кодировками без проблем, так что ваш код будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...