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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Как и в случае с 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 и может (и действительно) меняться между версиями.

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

См. здесь для более подробной информации: http://www.php.net/manual/en/mbstring.overload.php