htmlspecialchars(): недопустимая многобайтовая последовательность в аргументе

Я получаю эту ошибку на своем локальном сайте.

Warning (2): htmlspecialchars(): Invalid multibyte sequence in argument in [/var/www/html/cake/basics.php, line 207]

Кто-нибудь знает, в чем проблема или какое должно быть решение для этого?

Спасибо.


person gautamlakum    schedule 27.09.2010    source источник


Ответы (6)


Обязательно укажите кодировку UTF-8, если ваши файлы закодированы как таковые:

htmlspecialchars($str, ENT_COMPAT, 'UTF-8');

Кодировка по умолчанию для htmlspecialchars — это ISO-8859-1 (начиная с PHP v5.4 кодировка по умолчанию была изменена на «UTF-8»), что может объяснить, почему все идет наперекосяк, когда встречаются многобайтовые символы.

person Tatu Ulmanen    schedule 27.09.2010
comment
Строка 207 здесь. $charset = 'UTF-8'; htmlspecialchars($text, ENT_QUOTES, $charset); // Строка 207 - person gautamlakum; 27.09.2010
comment
Для меня эта проблема оказалась обратной: набор символов моих данных был на самом деле «ISO-8859-1», когда я пытался закодировать его как «UTF-8» в htmlspecialchars. Я переключил аргумент кодировки на «ISO-8859-1», и это решило проблему. По крайней мере, пока я не смогу полностью обновить все до «UTF-8». - person Kzqai; 06.11.2012
comment
Начиная с PHP 5.4.0, значением по умолчанию третьего параметра htmlspecialchars() является 'UTF-8' — этот ответ следует обновить. - person Walter Tross; 22.03.2013


Вы передаете в функцию поврежденные символьные данные или не указываете правильную кодировку.

У меня была эта проблема некоторое время назад, старое поведение (я полагаю, до PHP 5.2.7) заключалось в том, чтобы возвращать строку, несмотря на повреждение, но с этой версии вместо этого будет выдаваться эта ошибка.

Мое решение заключалось в написании сценария для передачи моих строк через iconv с использованием модификатора //IGNORE для удаления поврежденных данных.

(У нас была поврежденная база данных, в которой были некоторые строки в UTF-8, некоторые в латинице-1, обычно с неправильно определенными типами символов в столбцах).

(Глядя на комментарий к ответу Тату, я бы начал с просмотра (и игры) с содержимым переменной $charset.

person berty    schedule 27.09.2010
comment
Я согласен. Я передал пользовательские данные через iconv или mb_convert_encoding() с одинаковыми кодировками «от» и «до». Обычно есть возможность удалить недопустимые символы. - person Jeff Standen; 28.09.2010
comment
Здесь также повреждены данные, mb_convert_encoding($var, 'UTF-8') сделал свое дело. - person Jonah Braun; 25.07.2012

Правильный код, чтобы не было ошибок:

htmlentities($string, ENT_IGNORE, 'UTF-8') ;

Кроме того, вы также можете использовать str_replace, чтобы заменить некоторые неверные символы на свои нужды, а затем использовать функцию htmlentities.

Взгляните на этот rss-канал, он заменил большой знак html на gt; тег, который может выглядеть некрасиво при чтении RSS-канала. Вы можете заменить это чем-то вроде знака «-» или «)» и т. д.

person Sailab Rahi    schedule 20.05.2014

Была та же проблема, потому что я использовал substr в строке utf-8.
Ошибка была нечастой и, по-видимому, случайной. Ошибка возникала, только если строка была обрезана на многобайтовом символе!

mb_substr решил проблему :)

person CoR    schedule 23.10.2014

На самом деле это одна из самых частых ошибок, которые я получаю.

Иногда я не использую перевод __() — просто обычный немецкий текст, содержащий äöü. Там особенно важно следить за кодировкой файлов.

Поэтому убедитесь, что вы правильно сохраняете файлы, содержащие специальные символы, как UTF8.

person mark    schedule 28.09.2010