К вопросу о кодировке WordPress

Рубрика: WordPress -> Статьи
Суббота, 3 февраля 2007 г.
Просмотров: 2498
Подписаться на комментарии по 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 (своей сборки) для тестеров.

]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>
РЕКЛАМАмебель для ванной комнаты "АКВА РОДОС"

Комментариев: 8

Вы можете получать новые комментарии к этой записи по RSS или оформить подписку на все комментарии сайта. Или даже на все новые записи сайта. Не знаете, как это сделать?
  1. 2007-02-03 в 16:45:01 | Владимир

    Насколько я понимаю такое решение ранее не реализовывалось ни в платных, ни в бесплатных CMS... Браво)

  2. 2007-02-03 в 21:43:58 | Dimox

    Супер! Поздравляю с этим результатом!

  3. 2007-02-03 в 22:42:40 | AF

    А не могли бы вы поделится вышими наработками Я тоже потестирую... Да я думаю и другой народ подтянется =)

    Вместе веселей =)

  4. 2007-02-04 в 19:21:27 | TedBeer

    обрати внимание чтобы данные в базу сохранялись корректно, т.е. штатными средствами, например, phpMyAdmin, можно было сделать бэкап и восстановить. А то правильные хостеры делают регулярно бэкапы данных, а если ты не сможешь в случае аварии воспользоваться восстановлением ... значит сам дурак, что так хранил данные. А думать об этом надо заранее, а не когда петух клюнет в ж@..

  5. 2007-02-04 в 21:41:14 | Arien

    А если файл бэкапа открыть каким-нить "Штирлицем", должно помочь? Интересно на будущее (надеюсь, не понадобится), а то вдруг клюнет...

  6. 2007-02-04 в 22:55:06 | Максим

    а. Есть БД, у которой определена кодировка по-умолчанию (например, Windows-1251).

    б. Есть пользователь, который перевел кодировку БД с помощью «SET NAMES 'utf8'». В итоге БД WordPress'а хранится в кодировке, уже отличной от установленной админом.

    И в какой кодировке теперь получится бэкап, сделанный с помощью phpMyAdmin, если по-умолчанию (у таблиц) у него Windows-1251, а данные хранятся в UTF-8?

    Пока я вижу, что единственный способ как-то управлять кодировкой экспорта в phpMyAdmin, это выбрать опцию «Сопоставление соединения с MySQL». Но на свой страх и риск, поскольку phpMyAdmin может вместо SET NAMES, выполнить SET CHARACTER SET.

    Если же отойти от phpMyAdmin, то на мой взгляд лучшего средства, чем mysqldump нет. Большинство хостеров предоставляют доступ к резервированию БД в cPanel. В случае ошибки, опять же через cPanel, можно восстановть базу из этого файла. Тогда и база востановится один в один.

  7. 2007-02-05 в 00:32:53 | Arien

    Макс, можно ли рассчитывать, что если кодировка в базе по дефолту cp1251, а у меня «SET NAMES 'utf8'», но при этом в phpmyadmin всё нормально отображается (и на сайте, само собой), то в случае чего при восстановлении с бэкапа хостера всё будет ok? Слава Богу, с такой проблемой не сталкивалась, но кто знает.

    Я так часто, как это нужно, бэкапы не делаю, то есть надежда только на daily backup от хостера.

  8. 2007-02-05 в 01:08:08 | Максим

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

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

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)