У меня возникают некоторые проблемы при использовании следующего кода при вводе пользователем:
htmlentities($string, ENT_COMPAT, 'UTF-8');
При обнаружении недопустимого многобайтового символа PHP выдает уведомление:
Предупреждение PHP: htmlentities(): недопустимая многобайтовая последовательность в аргументе в /path/to/file.php в строке 123
Моей первой мыслью было подавить ошибку, но это медленно и плохо: http://derickretans.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 alsoвыдает E_NOTICE, когда удаляет/игнорирует недопустимые символы:
Если вы добавляете строку // TRANSLIT to out_charset Транслитерация активирована. Это означает, что когда символ не может быть представлен в целевой кодировке, он может быть аппроксимирован одним или несколькими похожими символами. Если вы добавляете строку //IGNORE, символы, которые не могут быть представлены в целевом наборе символов, автоматически отбрасываются. В противном случае str вырезается из первого недопустимого символа и генерируется E_NOTICE.
Так что здесь у меня почти нет вариантов. Я бы предпочел использовать проверенную и протестированную библиотеку для обработки такого рода вещей, чем пытаться сделать это с несколькими решениями на основе регулярных выражений, которые я видел.
Итак, это подводит меня к моему последнему вопросу: Как удалить недопустимые многобайтовые символы эффективно, безопасно и без уведомлений/предупреждений/ошибок?