Проблема "ш" и "И" в UTF-8 в нескольких лидирующих движках

Jackyk
На сайте с 05.10.2005
Offline
342
2174

Проблема: при использовании UTF-8 в ряде форумов и CMS буквы "ш" и "И" отображаются некорректно. Буква "ш" отображается как квадратик в IE и как "??" в FireFox, а буква "И" отображается как "п". У многих также встречаются другие проблемы с кодировками схожего характера. Различными пользователями проблемы были заявлены для vBulletin, Simplemachines forum (SMF), Drupal, Joomla... Вполне возможно, что список не ограничивается этими продуктами, так как проблемы идентичны, а значит, лежат за пределами конкретного движка.

При этом подразумевается, то что все кодировки настроены правильно, то есть уже для конкретной Базы Данных по запросу SHOW VARIABLES LIKE 'character_set%' выдается (в phpMyAdmin, например)

character_set_client utf8

character_set_connection utf8

character_set_database utf8

character_set_results utf8

character_set_server utf8

character_set_system utf8,

а по запросу SHOW VARIABLES LIKE 'collation%' выдается, например,

collation_connection utf8_general_ci

collation_database utf8_general_ci

collation_server utf8_general_ci.

В частности, character_set_database и collation_database необходимо верно задать при создании базы. А character_set_server задаётся в файле настроек my.cnf: в раздел [mysqld] (или [server]) надо прописать строку character_set_server =utf8 . Очень важно, что должны быть именно нижние подчеркивания, так как в Интернете и на сайте mysql как раз команда выглядит как character-set-server, но, поскольку там речь немного о другом, то в этом случае ничего не будет работать.

Итак, то, что вышесказанное выполнено - подразумевается, потому как, разумеется, данное сообщение не ставит целью предсказывать, как и что будет себе вести при разброде кодировок базы, сервера и т.д..

Важно то, что даже при верных настройках проблема остаётся.

Причина: судя по всему, кривизна скриптов. Вывод этот напрашивается потому, что есть продукты, работающие безо всяких проблем на том же сервере и на абсолютно аналогично настроенной БД.

Решение: в файле my.cnf, там же, где мы задаём character_set_server, в том же разделе [mysqld] или [server], необходимо прописать команду, отменяющую настройки character_set на стороне клиента. Таким образом, отсекается кривизна скрипта, эта команда лишает скрипт возможности проявить кривизну и испортить ею выдачу. Итак, надо прописать туда строку: skip_character_set_client_handshake. После этого надо перезапустить сервер баз данных MySQL.

Замечания:

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

--это решение применимо для MySQL, начиная от 4.1.15 и 5.0.13 .

Вывод: если мы не имеем доступа к серверным настройкам, либо используем более старые версии MySQL, описанное здесь явление может стать весьма серьезной проблемой для реализации проекта в кодировке UTF-8 с использованием ряда лидирующих на рынке продуктов, в том числе платных.

С уважением, Евгений.
D
На сайте с 19.05.2006
Offline
38
#1

В одном из скриптов с таким глюком добавил при подключении к базе SET_NAMES и всё встало на место.

в другом - ещё смешнее, где-то в глубине кода наткнулся на кодировку western.

все самописные скрипты работают нормально.

Jackyk
На сайте с 05.10.2005
Offline
342
#2

Господа, а может кто внятно объяснить, куда надо добавлять SET_NAMES? Про этот метод "лечения" читал. Но вот если взять тот же vBulletin, там обращение к базе, небось, в каждом файле присутствует, а файлов - тысячи. Подразумевается, что надо добавлять везде? Либо в какой-либо определенный файл серверных настроек, либо в .htaccess, либо ... в-общем - куда?

ZeHer
На сайте с 01.04.2006
Offline
87
#3

В конфигурационный файл, который должен по идее инклудиться во все файлы.

У меня была похожая проблема, у меня все sql конструкции вынесены в

sql.config.php

В функцию соединения с базой добавлял строку, все работало.

Вобщем что нужно сделать, если скрипт толковый, то обычно мускул функции выносятся в отдельный файл, нужно его найти, в нем отыскать функцию соединения с БД и в этой функции после команды соеднения выполнить команду set_names нужная_кодировка .

Но проблема может остатся, с данными уже записанными в БД, в зависимости от того как эти символы записались, возможно прийдется сливать дамп и пытаться его конвертировать.

Сочувствую :) мне такие танцы с бубном знакомы уже

Jackyk
На сайте с 05.10.2005
Offline
342
#4
ZeHer:
Сочувствую мне такие танцы с бубном знакомы уже

Да я-то решил уже этот вопрос, но у меня выделенный сервер, где я могу настраивать, что душе угодно. А вот как быть тем, кто желает запускать vB на shared'е в UTF-8, непонятно.

Пытался я это выяснить и в саппорте vB, но, конечно, без предоставления им всей "болезни" плюс логины/пароли они ничего сказать не могут, а вновь всё портить ради науки я не готов.

За разъяснение большое спасибо.

A
На сайте с 05.11.2005
Offline
111
#5

команда SET NAMES "кодировка"

должна выполняться сразу после коннекта с MySQL.

после этого мускул отдает/принимает данные в указанной вами кодировке

Если же в базу уже забиты кривые данные, то, боюсь, что эти Ӓ ничем уже не восстановить..

Jackyk
На сайте с 05.10.2005
Offline
342
#6
azzz:
команда SET NAMES "кодировка"
должна выполняться сразу после коннекта с MySQL.

Не сомневаюсь, что на уровне теории эти советы, прозвучавшие здесь уже не раз, может, и верны, но я лично (а может, и не только я) так и не понял, как конкретно это может помочь решить описанную конкретную проблему. А именно - куда конкретно в движке под конкретным названием vBulletin надо эту конкретную строку прописать. Если может кто дать ответ в виде: "такую-то строку надо прописать в такой-то файл вот в это место" - это будет реально полезно.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий