К вопросу о кодировке WordPress
Суббота, 3 февраля 2007 г.
Просмотров: 2504
Подписаться на комментарии по RSS
Как известно, для того, чтобы WordPress нормально работал, требуется единая кодировка базы данных и самого блога. Абсолютное большинство проблем, связанных с WordPress (установка и настройка) напрямую зависят от соответствия этих кодировок. Объясняется это очень просто: получив данные, WordPress сохраняет их в базе данных в той же кодировке.
Собственно, так поступают (наверное) все «движки». И это вполне нормально и очевидно.
На данный момент существуют две серьезные проблемы.
Первая - использование AJAX. Нравится он кому-нибудь или нет, но эта технология неизбежно будет развиваться и внедряться в WordPress. С точки зрения пользователя, AJAX очень удобен, поскольку не требуется перезагружать страницы для обновления данных. В WordPress'е AJAX используется, например при добавлении новой рубрики в редакторе; для удаления (с анимацией) рубрик, ссылок, записей и т.д.
Проблема здесь в том, что AJAX будет корректно работать только в UTF-8. Так уж он устроен. По этой причине, если мы хотим его полноценно использовать, нужно либо использовать UTF-8, либо придумывать различные функции кодирования/декодирования кодировки блога в/из UTF-8.
Пока это была единичная функция (добавление рубрики), то это можно как-то обойти. Но, с выходом WordPress 2.1, ситуация изменилась. AJAX используется шире, включая и работу с т.н. автосохранением. Для корректной работы этих новшеств требуются не просто исправления, а большие «костыли», которые не так и просто реализовать, не говоря уже о поддержке в будущих версиях. Такой подход, конечно же очень сложен и неоптимален.
Вторая проблема является чисто технической: база данных MySQL должна уметь корректно работать с юникодом (UTF-8). А это возможно только начиная с версии 4.1. То есть, даже если мы решим использовать UTF-8 (тем самым решая проблему №1), то сталкиваемся с тем, что не каждый хостер может предложить качественную работу базы данных с юникодом. Кроме этого, на русскоязычных хостингах, как правило, кодировка WINDOWS-1251 используется по умолчанию. Если не знать эти нюансы, то возникают проблемы при работе с WordPress. Например, выпадающие буквы «ш» и «и» стали уже «классикой» такого рода проблем.
Я неоднократно заявлял, что кодировка блога должна быть в кодировке базы данных. Это как аксиома. Но похоже, я нашел способ заставить WordPress работать с любой кодировкой базы данных. Грубо говоря: кодировка базы данных теперь не имеет значения.
Получается, что становится некритичным версия MySQL (>4.0.0): теперь нам не нужно использовать команды «SET...» для управления кодировкой базы данных.
Пока мне удалось реализовать этот алгоритм на тестовом блоге (WordPress 2.1) и никаких проблем не замечено. Пока я решил не выкладывать и не публиковать готовые файлы, поскольку нужно отработать еще несколько вопросов. В частности, я еще не до конца продумал процесс обновления блогов: для тех, кто работал в WINDOWS-1251, ничего менять в БД не придется, а для тех, кто использовал UTF-8, но захочет использовать кодировку БД сервера (WINDOWS-1251), могут возникнуть различные проблемы.
Правда пока только теоретические, поскольку я реализовал автоматическое определение кодировки - то есть блог сам будет принимать решение в какой кодировке хранятся данные в базе данных. На тестовом блоге, где изначально стояла кодировка UTF-8 (соответственно и записи были в этой же кодировке), после перехода на WINDOWS-1251 не было замечено ни одной ошибки. (То есть одни данные записывались в UTF-8, а другие в WINDOWS-1251). Но для окончательного вывода о нажедности автоопределения требуется еще тестирование.
Пока что результаты более, чем обнадеживающие. При этом не потребуется вносить никаких «костылей» в сам «движок» и не нужно будет переделывать функции плагинов и шаблонов (если, конечно они работают через wpdb).
После отработки основных вопросов я планирую выпустить WordPress 2.1 (своей сборки) для тестеров.



Комментариев: 8
Насколько я понимаю такое решение ранее не реализовывалось ни в платных, ни в бесплатных CMS... Браво)
Супер! Поздравляю с этим результатом!
А не могли бы вы поделится вышими наработками Я тоже потестирую... Да я думаю и другой народ подтянется =)
Вместе веселей =)
обрати внимание чтобы данные в базу сохранялись корректно, т.е. штатными средствами, например, phpMyAdmin, можно было сделать бэкап и восстановить. А то правильные хостеры делают регулярно бэкапы данных, а если ты не сможешь в случае аварии воспользоваться восстановлением ... значит сам дурак, что так хранил данные. А думать об этом надо заранее, а не когда петух клюнет в ж@..
А если файл бэкапа открыть каким-нить "Штирлицем", должно помочь? Интересно на будущее (надеюсь, не понадобится), а то вдруг клюнет...
а. Есть БД, у которой определена кодировка по-умолчанию (например, Windows-1251).
б. Есть пользователь, который перевел кодировку БД с помощью «SET NAMES 'utf8'». В итоге БД WordPress'а хранится в кодировке, уже отличной от установленной админом.
И в какой кодировке теперь получится бэкап, сделанный с помощью phpMyAdmin, если по-умолчанию (у таблиц) у него Windows-1251, а данные хранятся в UTF-8?
Пока я вижу, что единственный способ как-то управлять кодировкой экспорта в phpMyAdmin, это выбрать опцию «Сопоставление соединения с MySQL». Но на свой страх и риск, поскольку phpMyAdmin может вместо SET NAMES, выполнить SET CHARACTER SET.
Если же отойти от phpMyAdmin, то на мой взгляд лучшего средства, чем mysqldump нет. Большинство хостеров предоставляют доступ к резервированию БД в cPanel. В случае ошибки, опять же через cPanel, можно восстановть базу из этого файла. Тогда и база востановится один в один.
Макс, можно ли рассчитывать, что если кодировка в базе по дефолту cp1251, а у меня «SET NAMES 'utf8'», но при этом в phpmyadmin всё нормально отображается (и на сайте, само собой), то в случае чего при восстановлении с бэкапа хостера всё будет ok? Слава Богу, с такой проблемой не сталкивалась, но кто знает.
Я так часто, как это нужно, бэкапы не делаю, то есть надежда только на daily backup от хостера.
Сам хостер скорее всего делает бэкап всего сайта целиком. То есть сюда входит и база данных, и файлы аккаунта. Потом это все дело архивируется - это и есть файл бэкаба. В случае проблем, хостер просто указывает этот файл - система его восстановит в этом же виде.
Бэкап же базы данных скорее всего нужно делать самостоятельно либо попробовать его запускать по cron, если хостер разрешил. Тогда и восстановить базу можно без особых последствий.