У меня возникают некоторые проблемы, используя следующий код для ввода пользователя:
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);
работал очень хорошо для меня. Кажется, не генерирует никакого уведомления.