Проблемы с кодировками на хостингах

Ко мне очень часто обращаются по поводу проблем с кодировками на наших хостингах. Поэтому я решил, собрать всё воедино. 🙂

На большинстве русских хостингах, включая и Мастерхост, стоит кодировка по-умолчанию cp-1251 (windows-1251). По этой причине все соединения с БД инициируются именно в этой кодировке. Для того, чтобы кодировка была, как и положено в utf-8, необходимо при создании соединения с базой данных послать её специальный запрос, указывающий, что ваш блог работает utf-8.

В WordPress’е (начиная с 2.2) можно указать значение DB_CHARSET, которое переводит соединение в utf-8. Но для наших хостингов этого мало, поскольку нужно выполнять еще одну команду (COLLATE), которая переводит и внутреннее хранение данных в utf-8.

Так вот. Возможность использования COLLATE существует только в моей сборке, поскольку во всех остальных, включая и официальную, хоть и введен параметр DB_COLLATE, но реально нигде не используется. Это просто заготовка на будущее. Поскольку я постоянно сталкиваюсь "особенностями" наших хостингов, и знаю как криво настроены кодировки, то решил реализовать сразу правильное решение.

Больше всего проблем возникает со сборкой от mywordpress.ru, поскольку когда-то Антон решил за всех пользователей, что они должны работать в utf-8. Он жестко прописал в WordPress команду перевода в utf-8, хотя реально базы продолжали работать в cp-1251. В итоге произошло достаточно странные метаморфозы.

Изначально база на хостинге работала в cp-1251, то есть кодировки по умолчанию. Данные же из блогов на сборке от mywordpress.ru поступали в utf-8. И хотя отображение было корректно, но только по той причине, что начиная с MySQL 4.1 внутреннее хранение было в юникоде. Если же база не могла "переварить" юникод, то это отображалось как выпадение символов "ш" и "и" (иногда и другие). Это означает, что многобайтную кодировку (utf-8) пытались всунуть в однобайтную (cp-1251).

Но через какое-то время, на на наших хостингах массово стали переходить на новые версии MySQL (5.0). Админы, как и положенно взяли и перевели данные, которые теоретически дожны были быть в cp-1251, в utf-8. Получилось двойное преобразование.

Если у вас такой случай, то при просмотре данных в phpMyAdmin вы увидите либо разные кодировки сравнения (сопоставления) в таблицах WordPress, либо вообще крокозяблы в данных, хотя кодировка и будет указана верной.

Дополнительно это выражается еще и в том, что у вас неверно работает поиск. Например он дожен быть регистронезависимым. Также бывают проблемы с сортировкой по алфавиту. К сожалению, побороть это недуг средствами WordPress невозможно.

Пути решения.

В моей сборке, если вы устанавливаете блог с нуля, то берите utf-8. Это почти полная гарантия, что данные будут храниться в MySQL верно. Причем и для новых таблиц! Например тех, которые создают плагины. То есть вы сможете делать корректный бэкап, сортировку и поиск.

Если вы обновляете блог, то можно попробовать обновится до моей сборки WordPress 2.2 и выставить правильные DB_CHARSET и DB_COLLATE (все в новом файле wp-config.php). Например у меня для некоторых хостингов получалось добиться нормальной работы при cp1251 и cp1251_general_ci, хотя блог и база работали в utf-8.

Для самых тяжелых случаев, включайте перекодировщик.

Самый кардинальный способ решения – это полностью переделать базу данных. То есть взять дамп всех таблиц, вручную их переконвертировать, прописать верные COLLATE и обратно загрузить. Тогда у вас будет все корректно работать и в блоге, и в phpMyAdmin.

Сразу хочу предупредить тех, кто решит изменить кодировку таблиц в phpMyAdmin – с большой долей вероятности вы просто потеряете данные. То есть, если вы рискнете на эту операцию, в обязательном порядке делайте бэкап.

Дополнительный момент следует учитывать и в том, что на наших хостингах очень любят принудительно посылать браузеру кодировку windows-1251. В некоторых хостингах есть специальная опция в настройках. Но для других существует только единственное решение – принудительно прописать кодировку в .htaccess. Причем будьте готовы к тому, что это придется сделать в каждом каталоге. Таких кривых хостингов, типа мажордомо с петерхостом, как грязи.

Для этого попробуйте прописать в .htaccess по очереди такие строки:

AddDefaultCharset UTF-8
CharsetDisable On
CharsetDefault UTF-8
CharsetSourceEnc UTF-8
CharsetRecodeMultipartForms off

Учтите, что какие-то из них могут не сработать, а какие-то вызвать ошибку доступа (ERROR).

Еще информация о кодировках здесь: http://forum.maxsite.org/viewtopic.php?id=598

Anonymous
Отправить
Ответ на: