Logo

Преобразование кодировки сайта

Не смотря на популярность юникода по прежнему встречается сайты после кривого переноса база данных которых хранится в одной кодировке, а соединение к ней происходит в другой кодировке при этом бывает, что сам сайт использует третью кодировку. Из-за этого возникает много проблем т.к. в 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 способ

Если со скриптом ничего не получится то делаем все руками:

  1. Экспортируем базу (дамп) например через phpmyadmin
  2. Меняем кодировку файла на utf8 с помощью консольной программки iconv в notepad++ или что у вас есть под рукой.
  3. Редактируем файл сделав замену latin1 на utf8
  4. Импортировать базу обратно

Проверяем:

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}' ./*

Он просто меняет один текст на другой во всех файлах в текушей директории. Это пригодиться если сайт настолько ужасно написан что кодировка отдельно указанна в каждом файле. Но указав другой текст можно делать замену любого текста в файлах.

Ну вот если все сделать правильно и аккуратно то получим сайт целиком сделанный в юникоде.

 

Используемые источники:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *