При попытке запустить строку через функцию 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