Как исправить сохранение в базе данных символа è становится `e - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь сохранить тему входящих писем в базе данных. Субъект не всегда кодируется с использованием одной и той же кодировки, поэтому я создал этот код, чтобы преобразовать его обратно в utf-8, когда это не так.

private function convertSubjectEncoding($subject)
    {
        $encoding = mb_detect_encoding($subject);
        if($encoding != 'UTF-8') {
            return iconv_mime_decode($subject, 0, "UTF-8");
        }
        return $subject;
    }

Для первого сообщения кодировкой является UTF-8 и субъект это Accès SQL. Когда он сохраняется в базе данных, он становится «Acce`s SQL», что неверно и должно быть «Accès SQL». Для второго сообщения тема - Ascii, а исходная тема - "=? Utf-8? Q? Acc = C3 = A8s _? = SQL". При преобразовании, а также при сохранении это 'Accès SQL', что хорошо.

Почему эта строка, которая была первоначально отформатирована как ut8 и не получила никакого изменения кодировки, внезапно становится другой строкой при сохранении ? Я использую Laravel 6. Вот полный соответствующий код:

const SUBJECT_REPLY_FORWARD_REGEX = "/([\[\(] *)?\b(RE|FWD?) *([-:;)\]][ :;\])-]*|$)|\]+ *$/im";

private function createFetchedMail($message)
    {
        $toList = $message->getTo();
        $fetchedMail = FetchedMail::create([
            'OriginalSubject' => $this->convertSubjectEncoding($message->getSubject()),
            'Subject' => $this->cropSubject($this->convertSubjectEncoding($message->getSubject())),
        ]);

/**
* Removes subject reply and forwarding indacator (Re:, FWD:, etc.) and trims the result
*/
private function cropSubject($subject)
    {
        return trim(preg_replace(static::SUBJECT_REPLY_FORWARD_REGEX, '', $subject));
    }

private function convertSubjectEncoding($subject)
    {
        $encoding = mb_detect_encoding($subject);
        if($encoding != 'UTF-8') {
            return iconv_mime_decode($subject, 0, "UTF-8");
        }
        return $subject;
    }

Я пытался сохранить напрямую, не вызывая convertSubjectEncoding () и cropSubject (), я получаю ту же ошибочную строку, сохраненную в базе данных.

...