Ошибка недопустимой многобайтовой последовательности 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