Ошибка при работе с кирилицей. Прошу помощи

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

Аватар пользователя andreystrelkov andreystrelkov 28 июня 2012 в 14:57

Здравствуйте товарищи, меня это ошибка давно волновала, теперь окончательно запутался, и не знаю пути выхода.
Что имею, имею Drupal 7.14, абсолютно голый - только что развернул, ничего абсолютно не делал.

Опыт первый: в типе материала по умолчанию Article, добавляю поле File (filefield). После чего создаю материал типа Article и добавляю в него файл под названием "Это файл ридми.txt", материал сохраняю и он мне его показывает, навожу на ссылку файла пишет ссылку: .../sites/default/files/Это файл ридми.txt. Если щёлкаю по нему, то:

Warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in check_plain() (line 1572 of D:\wwwroot\WorkSite\uio\includes\bootstrap.inc).

PDOException: in dblog_watchdog() (line 154 of D:\wwwroot\WorkSite\uio\modules\dblog\dblog.module).

Захожу по тому пути, в поиске того файла, а он с ужасным именем: P-C,Ps C,,P°P№P» CЂPёPгPjPё.
Т.е. при заливке файла, он каким то образом коверкает его название.

Опыт второй: Пытаюсь найти русское слово: "Привет". Всплывает аналогичная ошибка.

Решил устнановить на сайте русский ещё язык, через админку поставил модули Locale и Content Translation, после чего просто добавил Russian.
Повторил опыты выше, тепере че, Internet Explorer стал писать вообще ошибку 500, а Firefox: PHP Fatal Error: Exception thrown without a stack frame in Unknown on line 0

Пошёл дальше, импортировал русский перевод 7.13 версии, перевелось примерно на 90%.

Повторил опыт выше, снова теже ошибки:

Warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in check_plain() (line 1572 of D:\wwwroot\WorkSite\uio\includes\bootstrap.inc).

PDOException: in dblog_watchdog() (line 154 of D:\wwwroot\WorkSite\uio\modules\dblog\dblog.module).

Данным постом хочу обобщить эту проблемму для многих и уже точно найти ответы, и попробовать их в действии, тем самым найти одно верное решение.
В чём может быть проблемма, слышал есть решение про изменение bootstrap.inc, там что с UTF8, но это ядро изменяется, и то вроде у меня это не помогло, какие ещё есть решения?

Спасибо всем заранее, за то что прочитали.

Комментарии

Аватар пользователя andreystrelkov andreystrelkov 28 июня 2012 в 20:56

с транслит это в принципе да, по принципу не маяться, поставить да и всё Smile Спасибо.
Но всё же, основной вопрос это с поиском, я завтра попробую по вашему совету с AddDefaultCharset UTF, отпишусь, Спасибо!

Аватар пользователя saratsubolg saratsubolg 10 июля 2012 в 17:42

Присоединяюсь к пользователю andreystrelkov.

У меня ситуация следующая:

сайт на 3 языках (рус,укр,англ), Друпал 7

При использовании стандартного поиска друпала (например http://exprint.in.ua/ru/search/node/%D0%91%D0%B0%D0%B3%D0%B0%D1%82%D0%BE%D1%84%D1%83%D0%BD%D0%BA%D1%86%D1%96%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%B8%D0%B9%20%D0%BF%D1%80%D0%B8%D1%81%D1%82%D1%80%D1%96%D0%B9%20Canon%20PIXMA%20MG6240 выдает ошибку
PDOException: в функции dblog_watchdog() (строка 154 в файле /home/ofis/exprint.in.ua/www/modules/dblog/dblog.module).

А вот например при поиске того же материала, но только на англ. языке http://exprint.in.ua/en/search/node/%D0%91%D0%B0%D0%B3%D0%B0%D1%82%D0%BE%D1%84%D1%83%D0%BD%D0%BA%D1%86%D1%96%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%B8%D0%B9%20%D0%BF%D1%80%D0%B8%D1%81%D1%82%D1%80%D1%96%D0%B9%20Canon%20PIXMA%20MG6240 все нормально работает

Ошибка появляется при поиске отдельных материалов, а так в целом поиск работает нормально, но ведь это не хорошо.

Вобшем помогите кто в теме.

Аватар пользователя saratsubolg saratsubolg 10 июля 2012 в 21:41

Ндааа ... как я вижу помощи ждать не от кого, как гритса "спасение утопающего дело рук самого утопающего"

Вобшем проблему я решил следующим образом, открываю в редакторе файл modules\dblog\dblog.module ... ищу линию 154, которая соответствует ф-и dblog_watchdog ... ->execute();

function dblog_watchdog(array $log_entry) {
Database::getConnection('default', 'default')->insert('watchdog')
->fields(array(
'uid' => $log_entry['uid'],
'type' => substr($log_entry['type'], 0, 64),
'message' => $log_entry['message'],
'variables' => serialize($log_entry['variables']),
'severity' => $log_entry['severity'],
'link' => substr($log_entry['link'], 0, 255),
'location' => $log_entry['request_uri'],
'referer' => $log_entry['referer'],
'hostname' => substr($log_entry['ip'], 0, 128),
'timestamp' => $log_entry['timestamp'],
))
->execute();
}

начинаю выводить аргумент ф-и $log_entry с помощью dsm() http://awesomescreenshot.com/093a507a0 ... и замечаю, что элемент массива $...['link'] в моем случае, имеет длину больше чем 255, и с чего делаю предположение, что скорее всего в следствии принудительного обрезания $...['link'], идет попытка вставки ссылки/тега с незакрытыми кавычками атрибутов (типа title), в таблицу watchdog в поле link, из за чего скорее всего и возникает ошибка.

Поэтому делаю следующее:
меняю строку в ф-и dblog_watchdog
'link' => substr($log_entry['link'], 0, 255),
на
'link' => substr($log_entry['link'], 0, 450), // Тут конечно по вкусу ...

и не забываем в таблице watchdog, сменить длину поля link до 450

Вот собственно и все!

П.С. Да я понимаю, что при обновлении ядра, это придется делать заново, НО будем надеяться, что в новой версии это учтут.

Аватар пользователя borovinskiy borovinskiy 12 июля 2013 в 12:56

saratsubolg wrote:
http://awesomescreenshot.com/093a507a0 ... и замечаю, что элемент массива $...['link'] в моем случае, имеет длину больше чем 255, и с чего делаю предположение, что скорее всего в следствии принудительного обрезания $...['link'], идет попытка вставки ссылки/тега с незакрытыми кавычками атрибутов (типа title), в таблицу watchdog в поле link, из за чего скорее всего и возникает ошибка.

На самом деле кириллица в UTF-8 двухбайтная и при применении substr($log_entry['link'],0,255); в некоторых случаях отсекается второй байт и символ оказывается не UTF-8.

Если не хочется править схему БД, то можно провести такой хак:

Заменить в функции dblog_watchdog строку

'link' => substr($log_entry['link'], 0, 255),

на

'link' => truncate_utf8($log_entry['link'],255),

Отправил https://drupal.org/node/2039527, но он не прошел автоматическое тестирование. Кто-то хочет довести дело до конца?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 10 июля 2012 в 21:49

"saratsubolg" wrote:
Ндааа ... как я вижу помощи ждать не от кого, как гритса "спасение утопающего дело рук самого утопающего"

Спасение утопающих нереально без указания ошибки, до редактирования в вашем посте было только про PDO Exeption, так что гребите сами

Аватар пользователя saratsubolg saratsubolg 10 июля 2012 в 22:23

Так ведь гребти то дальше, не куда, приплили батенька ) ... или выгребли, САМИ заметьте.

А если серьёзно, то Вам и той информации которую я оставил в первом своем посте

Друпал 7,
PDOException: в функции dblog_watchdog() (строка 154 в файле /home/ofis/exprint.in.ua/www/modules/dblog/dblog.module).

вполне достаточно,чтобы начать шевелить мозгами, переспросить у меня, и в результате прийти к решению данной проблемы САМОМУ ... Я ВЕДЬ СМОГ.

Аватар пользователя denis.pimenov denis.pimenov 7 августа 2013 в 23:52

Удалось ли доплыть? у меня версия 7.22 выдаёт:
PDOException: SQLSTATE[IMSSP]: An error occurred translating string for input param 7 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page. в функции dblog_watchdog() (строка 160 в файле C:\inetpub\wwwroot\modules\dblog\dblog.module).
попробовал заменить строку, но изменений не узрел.

Добавление...
обнаружил, что при отключении чистых ссылок эта ошибка не появляется, но и в поиске по 0, хотя я набирал слова, которые есть на сайте...

есть мысли, как поправить модуль чистых ссылок и что делать с поиском?

Аватар пользователя venoel venoel 6 января 2014 в 18:11

Добрый день.
Столкнулся с проблемой появления ошибки PDOException: in dblog_watchdog() .
Проявляется она у меня при выполнении поискового запроса содержащего кириллицу.
http://drupal7.local/search/node/какойтотекст
Проявляется в среде Windows+Drupal7+IIS 7. На Windows+Drupal 7+Apache поиск отрабатывает корректно.

Решение (файл bootstrap.inc, функция watchdog):

<?php
--- /includes/bootstrap.inc    Mon Jan 06 15:56:26 2014
+++ /includes/bootstrap.inc    Mon Jan 06 15:53:45 2014
@@ -1723,+1723,@@
       
'link'        => $link,
       
'user'        => $user,
       
'uid'         => $user_uid,
-      
'request_uri' => $base_root request_uri(),
+      
'request_uri' => urlencode($base_root request_uri()),
       
'referer'     => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '',
       
'ip'          => ip_address(),
       
// Request time isn't accurate for long processes, use time() instead.
?>

P.S. Ну и после каждого обновления редактировать Smile

Аватар пользователя venoel venoel 14 января 2014 в 22:02

Патч для IIS годится только для Drupal менее, чем 7.23? Не совсем понял Ваше сообщение.

Я ошибку обнаружил еще на Drupal... не помню какой, где-то в августе. Осенью вот нашел как можно исправить в bootstrap.inc. Потом обновил Drupal и забыл где и что менял.:)

Вот опять вспомнил и решил написать, чтобы было где найти:) Сейчас Drupal 7.25.

Аватар пользователя denis.pimenov denis.pimenov 14 января 2014 в 22:49

нет, просто обновлять лень, т.к. помимо этого косяка есть ещё косяк вебверстальщика, который тему верстал, в итоге тег float: отрабатывает криво, а он в куче файлов. После обновления придётся много ручками работать. До лета точно трогать ничего не буду.

Аватар пользователя dragon658 dragon658 23 января 2014 в 21:39

У меня тоже были эти ошибки при попытке сохранить ноду

Warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in check_plain() (line 1572 of D:\wwwroot\WorkSite\uio\includes\bootstrap.inc).
PDOException: in dblog_watchdog() (line 154 of D:\wwwroot\WorkSite\uio\modules\dblog\dblog.module)

Оказалось, что проблема в том, что у меня стоял pathauto, и он автоматически делал мой url слишком длинным, и кривой друпал его не запоминал.

То есть у меня был автоматический url /content/инвестор-вася-пытается-свести-счеты-с-жизнью, на нем выдавалась ошибка, я его заменил на /content/инвестор-вася-пытается и все стало нормально.

Аватар пользователя Darth Raven Darth Raven 12 марта 2014 в 7:52

RxB wrote:
"dragon658" wrote:
и кривой друпал его не запоминал.

Вот ука этот друпал!

И еще какая Smile

function dblog_watchdog(array $log_entry) {
Database::getConnection('default', 'default')->insert('watchdog')
->fields(array(
'uid' => $log_entry['uid'],
'type' => drupal_substr($log_entry['type'], 0, 64),
'message' => $log_entry['message'],
'variables' => serialize($log_entry['variables']),
'severity' => $log_entry['severity'],
'link' => drupal_substr($log_entry['link'], 0, 255),
'location' => $log_entry['request_uri'],
'referer' => $log_entry['referer'],
'hostname' => drupal_substr($log_entry['ip'], 0, 128),
'timestamp' => $log_entry['timestamp'],
))
->execute();
}

Вместо substr() используем drupal_substr().
Код для Drupal 7.

Аватар пользователя Artuur Artuur 30 января 2015 в 13:25

у меня такая ошибка была, я изменил
'link' => drupal_substr($log_entry['link'], 0, 255)
на
'link' => drupal_substr($log_entry['link'], 0, 511)

и потом через phpmyadmin в таблице watchdog длину поля link с 255 до 511 увеличил