Мой сайт о WordPress и PHP
 
3 февраля 2007

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

Читали 3435 раз
Рубрика: Новости мира WordPress
Навигация: Главная » WordPress » Новости мира WordPress

Как известно, для того, чтобы 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 (своей сборки) для тестеров.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

8 комментариев к “К вопросу о кодировке WordPress”

  1. Владимир:

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

  2. Dimox:

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

  3. AF:

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

  4. TedBeer:

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

  5. Arien:

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

  6. Максим:

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

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

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

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

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

  7. Arien:

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

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

  8. Максим:

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

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


Оставьте комментарий! (Вы согласны с правилами)

 

:mrgreen: :neutral: :twisted: :arrow: :shock: :smile: :???: :cool: :evil: :grin: :idea: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: :!: :?:

При добавлении кода (html, php) заменяйте < на &lt; и > на &gt;.
Внимание: антиспам - зверь! Копируйте своё сообщение перед отправкой. На всякий случай.