Почему PHP говорит, что строка является допустимой UTF-8, а PostgreSQL регистрирует ошибку "недопустимая последовательность байтов" при попытке вставить ее в базу данных? - PullRequest
0 голосов
/ 10 января 2020

Я получаю электронные письма через IMAP с PHP.

Прежде чем пытаться ВСТАВИТЬ каждое новое входящее сообщение электронной почты в мою базу данных, я делаю базовую c проверку, чтобы тело текст (как открытый текст, так и HTML версии, если оба существуют) являются «действительными UTF-8», и если нет, я просто отбрасываю их и пропускаю обработку дальше. Я делаю это с помощью следующего кода, который я определил как правильный после того, как провел бесчисленные часы своей жизни, ища в Интернете и пробуя себя, буквально лет :

function string_is_valid_UTF8($string)
{
    if (!mb_check_encoding($string, 'UTF-8'))
        return false;
    else
        return true;
}

Иногда кажется, это не имеет значения, потому что электронное письмо проскальзывает к коду PHP, который затем вставляет его в таблицу базы данных PostgreSQL, и, таким образом, это происходит:

pg_query_params(): Query failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xa0:

Неважно какие проверки я делаю заранее, некоторые всегда проскальзывают, регистрируя эту ошибку. Снова и снова ...

Что именно мне нужно сделать, чтобы убедиться, что никогда не произойдет ?! Что плохого в коде у меня есть? Почему PHP говорит, что это действительно UTF-8, а PostgreSQL нет ?! Как это вообще возможно?

Последнее электронное письмо, которое побудило меня снова попытаться спросить об этом, было каким-то искаженным спам-письмом, в котором была только HTML часть. Он содержит где-то испорченный UTF-8. Конечно, не имеет значения, что он содержит или что анализирует. Важно то, что PHP видит это как "ОК", а PG видит это как "неправильно", и поэтому в результате регистрируется проклятая ошибка, а не вся электронная почта игнорируется, как я желаю.

Что я делаю не так? Это мучило меня очень долгое время, и мне нужно решить его раз и навсегда!

...