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

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

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

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

PHP Warning: 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.

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

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

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

Ну, как вы уже указали в своем вопросе самостоятельно ( или, по крайней мере, связаны ), удаление недействительных байтовых последовательностей не является вариантом.

Вместо этого его следует заменить на заменяющий символ U + FFFD. Начиная с PHP 5.4.0 вы можете использовать флаг htmlentities для htmlentities . Вероятно, это наиболее безопасно, если вы не хотите отклонять строку.

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

iconv('UTF-8', "ISO-8859-1//IGNORE", $string);

работал очень хорошо для меня. Кажется, не генерирует никакого уведомления.