При попытке прочесть сообщение пользователя в записях системного журнала обнаруживается следующая ошибка.
htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument в файле /home/r/..мой сайт../public_html/includes/bootstrap.inc в строке 860.
Если кто-то сталкивался с подобной проблемой или знает как с этим справиться прошу помощи в решении вопроса.
С уважением, Роман.
Комментарии
проверьте соответствие кодировок.
не совсем понятно, какое именно сообщение, какой модуль вызывает и тд.
но у меня такое было изза кодировок. попадание BOM символов.. или хуже того - кириллица в составе "без utf8"
Как правило, подобная срань с кодировками лечится добавлением в .htaccess директивы
Но это как правило. Приведите скрин самого сообщения в журнале.
не всегда.
достаточно впихнуть кириллицу в файл с кодировкой в ansi - эффект тот же.
это как предположение об источнике ошибки. такое бывает. когда в t() вписано одно, а по факту на русский выдает кириллицу.
или того хуже - в винцп 1251..
еще вариант подобной ошибки - это спецсимволы в ссылке. функция l() и pathauto(особенно если еще и вои токены юзать) выдает интереный вариант.
советую включить вывод notice - много интересного увидите, и скорее всего эту ошибку по факту.
но опять же - я хз где это такое. мало вводных данных.
Т.е. пользователь пишет мне сообщение (используется модуль Private messages). Я как админ читаю его. Затем заглядываю в записи системного журнала и там вижу то, что показывает прикрепленный скриншот. Притом пользователь жалуется, что сообщения не прикрепляются с первого раза (не знаю, связано ли это).
Можно ли вставлять AddDefaultCharset UTF-8 в файл .htaccess рабочего сайта или это чревато? И куда это вставлять в файле, в конец его можно ли?
P.S. как вообще проверить соответствие кодировок и где это делается? Раньше такого ни разу не было, а сайт работает уже несколько лет исправно.
Вот картинка
Согласен, вот почему и написал "как правило".
Кстати, о крылатых. romik-wlemik, вы часом тему оформления не правили или модуль какой-то? Потому что припоминаю у меня была такая беда, оказалось просто не в той кодировке сохранил файл. Да и вот в этой ветке на это грешат.
Я сам давно использую одну и ту же тему. А вот сторонний разработчик недавно подключал плеер на сайт для создания подкаста. Возможно, что где-то и другая кодировка, но теперь точно трудно сказать.
Подскажите, пожалуйста, друзья, а какие есть способы поиска файла в неправильной кодировке? Как его точно отыскать и править?
1. смотрите в логах, когда эта хрень началась
2. вспоминаете что делалось в этот период
В описываемой выше ветке (см. ссылку выше) говорится об изменении кода ядра при возникновении подобного вопроса, однако, мы знаем, что это плохо в друпал, верно?
И где мне смотреть логи, если проблема длится уже пару месяцев? В записях системного журнала эта информация уже отсутствует. Неужели нет способа вычислить ошибку более точечно, так сказать?
Может быть кто-то возьмется сделать это за деньги?
Нашел два файла, которые в нотпаде открываются в кодировке ANSI, МОжет бть из-за них ошибка такая?
Пробую поменять на кодировку ANSI as UTF-8, однако при этом файл не хочет сохраняться. Возможно, так и надо?
Скорее всего в этих файлах и проблема.
Берете свои два файла, открывайте в Notepad++ в меню Кодировки выбираете Преобразовать в UTF-8 без BOM, затем сохраняете и заливаете с заменой на хост.
Совсем забыл. Поскольку у рабочего сайта файлов тысячи, перелопатить все вручную невозможно, почитайте вот это, должно помочь. Также погуглите на предмет пакетной смены кодировки текстовых файлов. Если уже и это не поможет, то тогда надо копать дальше.
Спасибо, друзья.
Самое интересное, что не помню где накопал вот такой код, но он работает.
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. надеюсь, что изменение в ядре в данном случае будет не очень вредно, пока только на пользу.
да, не закончил фразу. Так вот изменение файлов в ansi не привело к нужным результатам, сорри.
Если в файле используются только универсальные символы, т.е. те, которые совпадают в обеих кодировках, то notepad++ выставит ANSI, т.е., даже если вы перекодируете файл, сохраните его в UTF, при повторном открытии он так же будет ANSI. А теперь представим, что Вы написали некий модуль, сохранили его в UTF, через некоторое время открыли его в notepad++ и добавили, скажем, коментарий в кириллице, а затем сохранили не обратив внимание на кодировку ANSI(ведь сохраняли до этого Вы его в UTF без BOM), и вот тут уже могут начаться "приколы".
какая версия сборки пхп на сервере?
у меня было что ез моего ведома меняли с 5.2 на 5.3, и были похожие головные боли.. у вас 6ка. Может в этом головняк (в 5.3)?))
Версия php сейчас 5.2.17. Трудно сказать теперь что мог поменять хостер без моего ведома или просто по ошибке. Все возможно. Все мы люди. В последнее время я испытывал с хостером некоторые недоразумения к тому же.
На самом деле в моем случае речь шла о двух файлах в папке templates. Файлы небольшие и полностью просмотрены на предмет кракозябров - все чисто. Я в них ничего не менял. Может быть разработчик в процессе работы мог изменять и пересохранять описываемым способом. Но что теперь делать?
Ведь то, что я сделал - оно работает, но я понимаю, что что-то может быть неправильно. Код ядра ведь правил!
В данном случае это всего лишь костыль, сделайте патч, или меняйте хостинг.
5.2.17 ниже 5.2.5?
да, затупил, к тому же тут еще и 6 версия
Да,да. Пока что версия 6.28 Друпала (самая последняя из 6). Поэтому версия PHP вроде как подходит.
Сорри, а что значит сделать патч в данном случае?
http://www.youtube.com/watch?v=rQm6xI3VUWE
Спасибо Вам, друзья.
Я так понимаю, что на этом можно пока закрывать тему.