htmlspecialchars(): неверная многобайтовая последовательность в аргументе
Я получаю эту ошибку на моем локальном сайте.
Warning (2): htmlspecialchars(): Invalid multibyte sequence in argument in [/var/www/html/cake/basics.php, line 207]
Кто-нибудь знает, в чем проблема или каким должно быть решение для этого?
Благодарю.
6 ответов
Обязательно укажите кодировку UTF-8, если ваши файлы закодированы так:
htmlspecialchars($str, ENT_COMPAT, 'UTF-8');
Набор символов по умолчанию для htmlspecialchars
это ISO-8859-1 (по состоянию на PHP v5.4 кодировка по умолчанию была превращена в 'UTF-8'), что может объяснить, почему дела идут плохо, когда встречаются многобайтовые символы.
Я столкнулся с этой ошибкой на производстве и нашел этот великий пост об этом -
http://insomanic.me.uk/post/191397106/php-htmlspecialchars-htmlentities-invalid
Похоже, это ошибка в PHP (по крайней мере, для CentOS), которая отображает эту ошибку, когда ошибки отображения выключены!
Вы вводите поврежденные символьные данные в функцию или не указываете правильную кодировку.
У меня была эта проблема некоторое время назад, старое поведение (до PHP 5.2.7, я полагаю) заключалось в том, чтобы возвращать строку, несмотря на повреждение, но, начиная с этой версии, она выдаст эту ошибку.
Мое решение заключалось в написании сценария для подачи моих строк через iconv с использованием модификатора //IGNORE для удаления поврежденных данных.
(У нас была поврежденная база данных, в UTF-8 было несколько строк, некоторые из них в латинице-1, обычно с неправильно определенными типами символов в столбцах).
(Глядя на комментарий к ответу Тату, я бы начал с просмотра (и игры с) содержимого переменной $charset.
Правильный код, чтобы не было ошибок:
htmlentities($string, ENT_IGNORE, 'UTF-8') ;
Помимо этого вы также можете использовать str_replace
заменить некоторые плохие символы для ваших нужд, а затем использовать функцию htmlentities.
Посмотрите на этот RSS-канал, он заменил больший знак HTML на GT; тег, который может выглядеть не очень хорошо при чтении RSS-ленты. Вы можете заменить это на что-то вроде "-" знак или ")" и т. Д.
Была такая же проблема, потому что я использовал substr
на строке utf-8.
Ошибка была нечастой и, казалось бы, случайной. Ошибка произошла, только если строка была обрезана на многобайтовом символе!
mb_substr
решил проблему:)
На самом деле это одна из самых частых ошибок, которые я получаю.
Иногда я не использую перевод __() - просто текст на немецком языке, содержащий äöü. Там особенно важно учитывать кодировку файлов.
Поэтому убедитесь, что вы правильно сохраняете файлы, содержащие специальные символы, как UTF8.