Как вылечить UTF ...

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

Любая версия phpmyadmin конектиться к базе в дефолтной collation мускуля, как правило это latin_1. А мы хотим UTF. Вот и получаются в базе кракозябры и как следствие при переезде на новый хост неправильный дамп базы и тут начинаются проблемы.

На некоторых хостах может спасти вот это в .htaccess:

AddDefaultCharset utf8
CharsetDefault utf8
CharsetSourceEnc utf8

Однако этого мало. Проверьте свою базу через phpmyadmin, наверняка в ней кракозябры. В таком случае Вам поможет следующее.

Ищем замечательную программку под названием Navicat. Эта програмка может конектиться к базе так, как ей скажешь. Подключение настраивается через SSH. Смотрите скриншоты (раз, два, три). Установить всё как там есть и можете подсоединяться. 90% что теперь Вы увидите свою базу на родном языке. Если нет, то нужно что-то придумывать.

Делаем dump базы через эту прогу, сохраняя в текстовый файл. Затем нужно будет открыть этот дамп в текстовом редакторе. Блокнот-подобные оставьте для других целей. Я использовал Dreamweaver 8.

В этом файле нужно сменить все Latin_1 на utf8. В DW8 это делается нажатием CTRL+F (найти и заменить). После этого сохраняете файл и грузитесь через phpmyadmin.

В phpmyadmin первым делом ставите collation mysql utf_unicode_ci. И в созданной для блога базе (пока еще ничего не импортируем, она должна быть пустая) меняем (скорее всего именно «меняем») в Operations latin_1 на utf_unicode_ci.

Если в конце не полчиться, то смените db collation на utf_general_ci

А вот теперь можно заливать отредактированную базу. Это еще не всё. Идём в папку wp-includes нашего блога и открываем в текстовом редакторе файл wp-db.php, в котором ищем строку примерно 57. В этой строке написано:

$this->select ($dbname);

Добавляем следующей строчкой SET NAMES и у нас получиться такое:

$this->select ($dbname);
$this->query («SET NAMES utf8»);

Естественно, залейте его обратно на хост. А теперь можете заходить на главную страницу своего WP-блога и наслаждаться. Если зайдете в phpmyadmin, то там база тоже будет на русском. Поздравляю, Вы справились.

ps. За помощь и советы отдельное спасибо Владимиру и InsaneX.

Вам могут быть также интересны записи по этой теме:
Переезд с Blogger на Wordpress
Как я перевел блог на UTF-8

Постоянная ссылка   Трекбек   Данные о записи

  • Столько хлопот. Они тогостоят?

    Еси изначально всё далаить в юникоде никаких проблем не будет

    Ответить

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

    Чуть позже напишу сам.

    Ответить

  • Супер! Только что по этому руководству один из блогов поднимал. Полет нормальный.

    Только не понял, зачем последние манипуляции с wp-db.php

    Ответить

  • [quote post="557"]Только не понял, зачем последние манипуляции с wp-db.php[/quote]

    Чтобы скрипт конектился к базе правильно — в utf. Серверная часть mysql работает в utf, а клиентская (wordpress) в latin1. Отсюда вся фигня и идёт. Я вообще не понимаю, почему перцы из WP до сих пор не добавили эту строку — многим бы юзерам стало легче от этого.

    Ответить

  • Может потому что разработчики пишут «паанглиски»? :-) Им вообще пох какая кодировка, пусть хоть ее вообще не будет :-)

    Ответить

  • И всё-таки есть вопросы :-) :

    1. Делаю дамп, как описано здесь — www.linux.by/wiki/index.p...HP_MySQL_charset .В файле дампа базы нет никаких указаний на COLLATION — только DEFAULT CHARSET=cp1251

    2. Дамп открываю в Notepad++ — естествено, в таблице wp_posts — «закорючки». Если установить Нотепаду Форматы «Кодировать в UTF8» или «Кодировать в UTF8 (без BOM)» (кстати, какой из них правильно использовать?) — то всё читается.

    Что сделать, чтобы на новом хостинге все было в UTF8?

    Ответить

  • DEFAULT CHARSET=cp1251 нужно заменить DEFAULT CHARSET=utf-8

    Редактору нужно установить опцию «Кодировать в UTF8 (без BOM)»

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

    Затем через PHPMYADMIN:

    Установить MySQL connection collation — utf_unicode_ci

    Потом саму базу тоже установить в utf8_general_ci

    Затем исправьте файл wp-db.php, как я описал в посте (добавить set names).

    И уже после этого, экспортнуть свою базу через пхпмайадмин (а лучше подключиться и сделать это через NetCat).

    Ответить

  • ага — спасибо, почти справился. Почему-то получилось, что база в utf8_unicode_ci, а таблицы — в utf8_general_ci (таблицы создавались при импорте). Но отображается по-русски нормально — надо ли исправлять collation?

    Ответить

  • Не, у меня именно в этой связке и заработал русский в базе. Буквально только что в группах гугла ru-wordpress, я там пару скриншотов выложил.

    Ответить

  • Переносил свой сайт. Пришлось немного повозиться. Очень помогла директива --default-character-set=cp1251 у Mysqldump :-)))

    Всем советую =)

    Ответить

  • Ar2r, вот бы вам отрезать кое что, чтобы вы гены свои в следующие поколения не передавали...

    Ответить

  • За что? У меня в базе cp1251 хранилась инфа в utf8 кодировке =)

    Ответить

  • Да, именно за это.

    А вообще за то, что cp1251 присутствует в вашем приложении в принципе

    Ответить

  • Супер! Что только не делал, чтоб убрать эти крякозябрики. Сколько возился в wp-db. А всего-то хватило поставить файл .htaccess.

    Спасибо Slaff!!!

    Ответить

  • Кстати, за прошедший год, в новых редакциях WP баг исправлен (строка 86 файла из родного дистрибудтива):

    if ( !empty($this->charset) && version_compare(mysql_get_server_info(), '4.1.0', '>=') ) $this->query("SET NAMES '$this->charset'");

    Ответить

  • Спасибо большое, фишка прокатила! Теперь с кодировкой все чики-пуки!

    Ответить

Ваш комментарий

XHTML: вы можете воспользоваться следующими тагами: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>