Ошибка: htmlspecialchars() [<a href='function.htmlspecialchars'>function.htmlspecialchars</a>]...

Главные вкладки

Аватар пользователя romik-wlemik romik-wlemik 5 мая 2013 в 2:40

При попытке прочесть сообщение пользователя в записях системного журнала обнаруживается следующая ошибка.
htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument в файле /home/r/..мой сайт../public_html/includes/bootstrap.inc в строке 860.

Если кто-то сталкивался с подобной проблемой или знает как с этим справиться прошу помощи в решении вопроса.
С уважением, Роман.

Комментарии

Аватар пользователя t1mm1 t1mm1 5 мая 2013 в 3:33

проверьте соответствие кодировок.
не совсем понятно, какое именно сообщение, какой модуль вызывает и тд.
но у меня такое было изза кодировок. попадание BOM символов.. или хуже того - кириллица в составе "без utf8"

Аватар пользователя Faceless Faceless 5 мая 2013 в 4:03

Как правило, подобная срань с кодировками лечится добавлением в .htaccess директивы

AddDefaultCharset UTF-8

Но это как правило. Приведите скрин самого сообщения в журнале.

Аватар пользователя t1mm1 t1mm1 5 мая 2013 в 4:09

Faceless wrote:
Как правило, подобная срань с кодировками лечится добавлением в .htaccess директивы

AddDefaultCharset UTF-8

Но это как правило. Приведите скрин самого сообщения в журнале.

не всегда.
достаточно впихнуть кириллицу в файл с кодировкой в ansi - эффект тот же.
это как предположение об источнике ошибки. такое бывает. когда в t() вписано одно, а по факту на русский выдает кириллицу.
или того хуже - в винцп 1251..

еще вариант подобной ошибки - это спецсимволы в ссылке. функция l() и pathauto(особенно если еще и вои токены юзать) выдает интереный вариант.
советую включить вывод notice - много интересного увидите, и скорее всего эту ошибку по факту.

но опять же - я хз где это такое. мало вводных данных.

Аватар пользователя romik-wlemik romik-wlemik 10 ноября 2015 в 11:49

Т.е. пользователь пишет мне сообщение (используется модуль Private messages). Я как админ читаю его. Затем заглядываю в записи системного журнала и там вижу то, что показывает прикрепленный скриншот. Притом пользователь жалуется, что сообщения не прикрепляются с первого раза (не знаю, связано ли это).

Можно ли вставлять AddDefaultCharset UTF-8 в файл .htaccess рабочего сайта или это чревато? И куда это вставлять в файле, в конец его можно ли?
P.S. как вообще проверить соответствие кодировок и где это делается? Раньше такого ни разу не было, а сайт работает уже несколько лет исправно.

Аватар пользователя Faceless Faceless 5 мая 2013 в 5:49

"t1mm1" wrote:

достаточно впихнуть кириллицу в файл с кодировкой в ansi - эффект тот же.

Согласен, вот почему и написал "как правило".
Кстати, о крылатых. romik-wlemik, вы часом тему оформления не правили или модуль какой-то? Потому что припоминаю у меня была такая беда, оказалось просто не в той кодировке сохранил файл. Да и вот в этой ветке на это грешат.

Аватар пользователя romik-wlemik romik-wlemik 6 мая 2013 в 2:25

Я сам давно использую одну и ту же тему. А вот сторонний разработчик недавно подключал плеер на сайт для создания подкаста. Возможно, что где-то и другая кодировка, но теперь точно трудно сказать.
Подскажите, пожалуйста, друзья, а какие есть способы поиска файла в неправильной кодировке? Как его точно отыскать и править?

Аватар пользователя t1mm1 t1mm1 6 мая 2013 в 2:33

romik-wlemik wrote:
Я сам давно использую одну и ту же тему. А вот сторонний разработчик недавно подключал плеер на сайт для создания подкаста. Возможно, что где-то и другая кодировка, но теперь точно трудно сказать.
Подскажите, пожалуйста, друзья, а какие есть способы поиска файла в неправильной кодировке? Как его точно отыскать и править?

1. смотрите в логах, когда эта хрень началась
2. вспоминаете что делалось в этот период

Аватар пользователя romik-wlemik romik-wlemik 6 мая 2013 в 3:02

В описываемой выше ветке (см. ссылку выше) говорится об изменении кода ядра при возникновении подобного вопроса, однако, мы знаем, что это плохо в друпал, верно?
И где мне смотреть логи, если проблема длится уже пару месяцев? В записях системного журнала эта информация уже отсутствует. Неужели нет способа вычислить ошибку более точечно, так сказать?

Аватар пользователя romik-wlemik romik-wlemik 6 мая 2013 в 3:12

Нашел два файла, которые в нотпаде открываются в кодировке ANSI, МОжет бть из-за них ошибка такая?
Пробую поменять на кодировку ANSI as UTF-8, однако при этом файл не хочет сохраняться. Возможно, так и надо?

Аватар пользователя Faceless Faceless 6 мая 2013 в 6:12

"romik-wlemik" wrote:
Нашел два файла, которые в нотпаде открываются в кодировке ANSI, МОжет бть из-за них ошибка такая?
Пробую поменять на кодировку ANSI as UTF-8, однако при этом файл не хочет сохраняться. Возможно, так и надо?

Скорее всего в этих файлах и проблема.
Берете свои два файла, открывайте в Notepad++ в меню Кодировки выбираете Преобразовать в UTF-8 без BOM, затем сохраняете и заливаете с заменой на хост.

Аватар пользователя Faceless Faceless 6 мая 2013 в 6:18

Совсем забыл. Поскольку у рабочего сайта файлов тысячи, перелопатить все вручную невозможно, почитайте вот это, должно помочь. Также погуглите на предмет пакетной смены кодировки текстовых файлов. Если уже и это не поможет, то тогда надо копать дальше.

Аватар пользователя romik-wlemik romik-wlemik 9 мая 2013 в 1:45

Спасибо, друзья.
Самое интересное, что не помню где накопал вот такой код, но он работает.
if ($php525)
{
return (preg_match('/^./us', (string) $text) == 1) ? htmlspecialchars((string) $text, ENT_QUOTES, 'UTF-8') : '';
}
return (preg_match('/^./us', $text) == 1) ? htmlspecialchars($text, ENT_QUOTES, 'UTF-8') : '';
}

Его я вставил вместо родного

if ($php525) {
return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}
return (preg_match('/^./us', $text) == 1) ? htmlspecialchars($text, ENT_QUOTES, 'UTF-8') : '';
}

причем все файлы, что нашел в ansi, все два, "преобразовал" как описано выше (благодарю, Faceless), в UTF-8.

Появился ещё один вопрос. Может ли такое поведение быть связано с изменениями на хостинге? Был момент, когда в профиле хостер отключил часть функционала из-за превышения нагрузки (последнее возникло после отправки рассылки из примерно 150 писем пользоватлеям). Хостинг TimeWeb.
p.s. уже планирую сменить его.
p.s.2. надеюсь, что изменение в ядре в данном случае будет не очень вредно, пока только на пользу.

Аватар пользователя sg85 sg85 9 мая 2013 в 3:25

"romik-wlemik" wrote:
Так вот изменение файлов в ansi не привело к нужным результатам, сорри.

Если в файле используются только универсальные символы, т.е. те, которые совпадают в обеих кодировках, то notepad++ выставит ANSI, т.е., даже если вы перекодируете файл, сохраните его в UTF, при повторном открытии он так же будет ANSI. А теперь представим, что Вы написали некий модуль, сохранили его в UTF, через некоторое время открыли его в notepad++ и добавили, скажем, коментарий в кириллице, а затем сохранили не обратив внимание на кодировку ANSI(ведь сохраняли до этого Вы его в UTF без BOM), и вот тут уже могут начаться "приколы".

Аватар пользователя t1mm1 t1mm1 9 мая 2013 в 3:47

sg85 wrote:
"romik-wlemik" wrote:
Так вот изменение файлов в ansi не привело к нужным результатам, сорри.

Если в файле используются только универсальные символы, т.е. те, которые совпадают в обеих кодировках, то notepad++ выставит ANSI, т.е., даже если вы перекодируете файл, сохраните его в UTF, при повторном открытии он так же будет ANSI. А теперь представим, что Вы написали некий модуль, сохранили его в UTF, через некоторое время открыли его в notepad++ и добавили, скажем, коментарий в кириллице, а затем сохранили не обратив внимание на кодировку ANSI(ведь сохраняли до этого Вы его в UTF без BOM), и вот тут уже могут начаться "приколы".

какая версия сборки пхп на сервере?
у меня было что ез моего ведома меняли с 5.2 на 5.3, и были похожие головные боли.. у вас 6ка. Может в этом головняк (в 5.3)?))

Аватар пользователя romik-wlemik romik-wlemik 11 мая 2013 в 2:10

Версия php сейчас 5.2.17. Трудно сказать теперь что мог поменять хостер без моего ведома или просто по ошибке. Все возможно. Все мы люди. В последнее время я испытывал с хостером некоторые недоразумения к тому же.

"sg85" wrote:
А теперь представим, что Вы написали некий модуль, сохранили его в UTF, через некоторое время открыли его в notepad++ и добавили, скажем, коментарий в кириллице, а затем сохранили не обратив внимание на кодировку ANSI(ведь сохраняли до этого Вы его в UTF без BOM), и вот тут уже могут начаться "приколы".

На самом деле в моем случае речь шла о двух файлах в папке templates. Файлы небольшие и полностью просмотрены на предмет кракозябров - все чисто. Я в них ничего не менял. Может быть разработчик в процессе работы мог изменять и пересохранять описываемым способом. Но что теперь делать?
Ведь то, что я сделал - оно работает, но я понимаю, что что-то может быть неправильно. Код ядра ведь правил!

Аватар пользователя romik-wlemik romik-wlemik 12 мая 2013 в 0:05

Да,да. Пока что версия 6.28 Друпала (самая последняя из 6). Поэтому версия PHP вроде как подходит.
Сорри, а что значит сделать патч в данном случае?