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

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

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.

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

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

8
задан Dean 9 March 2012 в 08:59
поделиться