Ошибка недопустимой многобайтовой последовательности htmlentities

При попытке запустить строку через функцию htmlentities PHP у меня есть некоторые случаи, когда я получаю ошибку «Неверная многобайтовая последовательность». Есть ли способ очистить строку до вызова функции, чтобы предотвратить эту ошибку?

Для PHP 5.3.0 и ниже по умолчанию для htmlentities() используется ISO-8859-1. ( Руководство )

Вероятно, вы применяете его к строке UTF-8. Укажите набор символов, используя

 htmlentities($string, (whatever), "UTF-8"); 

Начиная с PHP 5.4.0, по умолчанию кодировка UTF-8.

Я столкнулся с сценариями, где недостаточно указать UTF-8 и найти параметр ENT_IGNORE полезным. Я не думаю, что он задокументирован для htmlentities, только для htmlspecialchars, но он работает, чтобы подавить ошибку.

Начиная с PHP 5.4 вы должны использовать что-то следующее для правильного выхода из вывода:

 $escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding); 

ENT_SUBSTITUTE заменяет неверные последовательности блоков кода на (вместо того, чтобы возвращать пустую строку).

ENT_DISALLOWED заменяет коды, которые недопустимы в указанном doctype с помощью .

ENT_HTML5 указывает используемый тип doctype. В зависимости от того, что вы используете, вы можете выбрать ENT_HTML401 , ENT_XHTML или ENT_XML1 .

Используя эти параметры, вы убедитесь, что результат всегда действителен в данном doctype, независимо от того, какой тип отвратительного ввода вы получаете.

Кроме того, не забудьте указать $stringEncoding . Опора по умолчанию – плохая идея, так как она зависит от настроек ini и может (и действительно) меняться между версиями.

В общем случае настройки php ini display_errors могут использоваться для управления отображением ошибок в браузере, установка ini log_errors может быть независимо использована для контроля того, записаны ли ошибки в лог-файл, и если пользовательский обработчик ошибок был задан с помощью set_error_handler () то это всегда вызывается для всех ошибок и может затем считывать значения display_errors и log_errors вместе со значением error_reporting () и выполнять соответствующий курс действий, не так ли?

Неправильно! В этом случае htmlspecialchars () и htmlentities () запускают ошибку только в том случае, если значение display_errors является ложным. Если значение display_errors истинно, ошибка не срабатывает вообще! Это, казалось бы, бессмысленное поведение делает невозможным обнаружение этих ошибок во время отладки с помощью display_errors.

Я получил информацию отсюда

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

html_entities (переменная $, ENT_QUOTES); всегда отлично работает для меня.

Обратите внимание, что использование utf-8 требует включения многобайтовых строковых функций. Это может означать замену функций, таких как substr, на mb_substr, за исключением того, что php предоставляет настройку php ini, чтобы включить перегрузку этих функций с помощью эквивалента mb.

Подробнее см. Здесь: http://www.php.net/manual/en/mbstring.overload.php