Не смотря на популярность юникода по прежнему встречается сайты после кривого переноса база данных которых хранится в одной кодировке, а соединение к ней происходит в другой кодировке при этом бывает, что сам сайт использует третью кодировку. Из-за этого возникает много проблем т.к. в phpmyadmin нельзя посмотреть русские названия без дополнительных преобразований и разбираться в такой каше очень тяжело. В этой статье рассмотрим как привести сайт к единой кодировке.
Мы будем приводить сайт целиком к кодировке UTF-8 т.к. она наиболее универсальная и будет правильно отображаться даже на иностранных операционных системах без поддержки русского языка.
Установка кодировки на сервере MySQL
Заходим на сервер где стоит MySQL.
Открываем файл конфигурации /etc/mysql/my.cnf. Выставляем кодировку по умолчанию для сервера:
[mysqld] character-set-server=utf8
Перезапускаем сервер:
/etc/init.d/mysql restart
Подключаемся из терминала клиентом:
mysql -u root -p
Выбираем базу и проверяем кодировки sql запросом:
USE basename; SHOW VARIABLES LIKE 'char%';
В результате получим табличку:
+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
Как видим у текущей базы кодировка latin1 что нас не устраивает, да и движок можно заменить на InnoDB.
Конвертация базы 1 способ
Для конвертации базы сделаем скрипт convert_db.php следующего содержания:
<?php if ($argc != 2) { echo $argv[0]." <DATABASE>\n"; exit(1); } $db = trim($argv[1]); if (!$link = mysql_connect('127.0.0.1', 'root', 'mypassword')) { die(mysql_error()); } if (!$db_selected = mysql_select_db($db)) { } echo "ALTER DATABASE `$db` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;\n"; if (!($result = mysql_query("SHOW TABLES;"))) { die (mysql_error()); } while ($row = mysql_fetch_assoc($result)) { $table = array_shift($row); echo "ALTER TABLE `$table` ENGINE = MYISAM;\n"; echo "ALTER TABLE `$table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;\n"; } ?>
Использовать его очень легко достаточно выполнить в терминале:
php convert_db.php dbname | mysql -uroot -p dbname;
На выходе мы получим список преобразованных таблиц.
Конвертация базы 2 способ
Если со скриптом ничего не получится то делаем все руками:
- Экспортируем базу (дамп) например через phpmyadmin
- Меняем кодировку файла на utf8 с помощью консольной программки iconv в notepad++ или что у вас есть под рукой.
- Редактируем файл сделав замену latin1 на utf8
- Импортировать базу обратно
Проверяем:
USE basename; SHOW VARIABLES LIKE 'char%';
Кодировка базы и таблиц должны стать стать utf8.
Конвертирование файлов сайта
Для перекодировки файлов самого сайта сделаем bash скриптик file_conv.sh:
#!/bin/bash if [ $# -lt 3 ] then echo "$0 dir from_charset to_charset" exit fi for f in $1/* do if test -f $f then echo -e "\nConverting $f" mv $f $f.old iconv -f $2 -t $3 $f.old > $f rm -f $f.old else echo -e "\nSkipping $f - not a regular file"; fi done
Использовать его тоже несложно:
file_conv.sh /var/www cp1251 utf8
Указываем папку для обработки, исходную кодировку и затем требуемую кодировку.
Замена кодировки в файлах
Осталось только заменить кодировку в html тегах чтобы браузер правильно ее воспринимал. Сделаем для этого ещё маленький скриптик:
#!/bin/bash A1='<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />' A2='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' awk '{gsub($A1, $A2, $0); print > FILENAME}' ./*
Он просто меняет один текст на другой во всех файлах в текушей директории. Это пригодиться если сайт настолько ужасно написан что кодировка отдельно указанна в каждом файле. Но указав другой текст можно делать замену любого текста в файлах.
Ну вот если все сделать правильно и аккуратно то получим сайт целиком сделанный в юникоде.