Я получаю электронные письма через 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 видит это как "неправильно", и поэтому в результате регистрируется проклятая ошибка, а не вся электронная почта игнорируется, как я желаю.
Что я делаю не так? Это мучило меня очень долгое время, и мне нужно решить его раз и навсегда!