Как вылечить 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
Michael de`OZ (Jun 29th, 2006 @ 12:29 pm)
Столько хлопот. Они тогостоят?
Еси изначально всё далаить в юникоде никаких проблем не будет
slaff (Jun 29th, 2006 @ 12:50 pm)
Да вот именно, что в самом начале и не знаешь что тебя ждёт. По-большому счету надо бы написать разработчикам ВП, чтобы вписали эту строку. Тогда не должно возникать проблем при начальной инсталяции.
Чуть позже напишу сам.
Setti (Aug 21st, 2006 @ 10:01 am)
Супер! Только что по этому руководству один из блогов поднимал. Полет нормальный.
Только не понял, зачем последние манипуляции с wp-db.php
slaff (Aug 21st, 2006 @ 1:10 pm)
[quote post="557"]Только не понял, зачем последние манипуляции с wp-db.php[/quote]
Чтобы скрипт конектился к базе правильно - в utf. Серверная часть mysql работает в utf, а клиентская (wordpress) в latin1. Отсюда вся фигня и идёт. Я вообще не понимаю, почему перцы из WP до сих пор не добавили эту строку - многим бы юзерам стало легче от этого.
Setti (Aug 22nd, 2006 @ 2:15 am)
Может потому что разработчики пишут “паанглиски”? :-) Им вообще пох какая кодировка, пусть хоть ее вообще не будет :-)
German (Sep 5th, 2006 @ 5:55 am)
И всё-таки есть вопросы :-) :
1. Делаю дамп, как описано здесь - http://www.linux.by/wiki/index.php/FAQ_PHP_MySQL_charset .В файле дампа базы нет никаких указаний на COLLATION - только DEFAULT CHARSET=cp1251
2. Дамп открываю в Notepad++ - естествено, в таблице wp_posts - “закорючки”. Если установить Нотепаду Форматы “Кодировать в UTF8″ или “Кодировать в UTF8 (без BOM)” (кстати, какой из них правильно использовать?) - то всё читается.
Что сделать, чтобы на новом хостинге все было в UTF8?
slaff (Sep 5th, 2006 @ 10:37 am)
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).
German (Sep 5th, 2006 @ 1:54 pm)
ага - спасибо, почти справился. Почему-то получилось, что база в utf8_unicode_ci, а таблицы - в utf8_general_ci (таблицы создавались при импорте). Но отображается по-русски нормально - надо ли исправлять collation?
slaff (Sep 5th, 2006 @ 2:16 pm)
Не, у меня именно в этой связке и заработал русский в базе. Буквально только что в группах гугла ru-wordpress, я там пару скриншотов выложил.
Ar2r (Mar 4th, 2007 @ 4:17 pm)
Переносил свой сайт. Пришлось немного повозиться. Очень помогла директива –default-character-set=cp1251 у Mysqldump :-)))
Всем советую =)
Setti (Mar 5th, 2007 @ 4:35 am)
Ar2r, вот бы вам отрезать кое что, чтобы вы гены свои в следующие поколения не передавали…
Ar2r (Mar 5th, 2007 @ 8:31 am)
За что? У меня в базе cp1251 хранилась инфа в utf8 кодировке =)
Setti (Mar 5th, 2007 @ 9:41 am)
Да, именно за это.
А вообще за то, что cp1251 присутствует в вашем приложении в принципе
Айнур (Nov 11th, 2007 @ 4:28 pm)
Супер! Что только не делал, чтоб убрать эти крякозябрики. Сколько возился в wp-db. А всего-то хватило поставить файл .htaccess.
Спасибо Slaff!!!
theUg (Feb 9th, 2008 @ 3:53 pm)
Кстати, за прошедший год, в новых редакциях WP баг исправлен (строка 86 файла из родного дистрибудтива):
if ( !empty($this->charset) && version_compare(mysql_get_server_info(), '4.1.0', '>=') )$this->query("SET NAMES '$this->charset'");