Удаление недействительных / неполных многобайтовых символов

У меня возникли проблемы с использованием следующего кода при вводе пользователем:

htmlentities($string, ENT_COMPAT, 'UTF-8');

При обнаружении недопустимого многобайтового символа PHP выдает уведомление:

Предупреждение PHP: htmlentities (): неверная многобайтовая последовательность в аргументе в /path/to/file.php в строке 123

Моей первой мыслью было подавить ошибку, но это медленная и плохая практика:http://derickrethans.nl/five-reasons-why-the-shutop-operator-should-be-avoided.html

Моя вторая мысль заключалась в использовании флага ENT_IGNORE, но даже руководство по PHP предлагает не использовать это:

Молча отбросить недопустимые последовательности единиц кода вместо возврата пустой строки. Использование этого флага не рекомендуется »может иметь последствия для безопасности.

Еще одна причина привела меня к следующему коду:

    // detect encoding
$encoding =  mb_detect_encoding($query);
if($encoding != 'UTF-8') {
    $query = mb_convert_encoding($query, 'UTF-8', $encoding);
} else {
    // strip out invalid utf8 sequences
    $query = iconv('UTF-8', 'UTF-8//IGNORE', $query);
}

К сожалению iconvтакже бросает E_NOTICE, когда он удаляет / игнорирует недопустимые символы:

Если вы добавите строку // TRANSLIT к out_charset, транслитерация активируется. Это означает, что когда символ не может быть представлен в целевой кодировке, он может быть аппроксимирован одним или несколькими одинаково выглядящими символами. Если вы добавите строку // IGNORE, символы, которые не могут быть представлены в целевой кодировке, будут молча отброшены. В противном случае str вырезается из первого недопустимого символа и генерируется E_NOTICE.

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

Итак, это подводит меня к моему последнему вопросу:Как я могу удалить недействительные многобайтовые символы, эффективно, безопасно, без уведомлений / предупреждений / ошибок?

Ответы на вопрос(2)

Ваш ответ на вопрос