WebGUI хостинг Документация по WebGUI Запустить персональную демо версию Форум
WebGUI по-русски

WebGUI по-русски

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

 

Перевод содержимого сайта из одной кодировки в другую.

Автор статьи: Владимир Витковский

www.webgui.uanet.biz, www.transport.su
При перепечатке ссылка на оригинал обязательна 

Одна из задач, которая встречается не так часто, но уж если встретится, то может вызвать немалую головную боль - это перевод содержимого сайта в другую кодировку. Есть один достаточно надёжный способ, как это сделать с минимальным количеством усилий.

Самый распространенный случай - это перевод из windows-1251 в UTf-8, его и опишем, хотя этот способ работает и при переводе из любой другой кодировки в любую другую - проверено на практике.

Начнём с базы данных. Для начала сделайте дамп всей базы данных (структура + данные) и перенесите его на локальную машину. При создании дампа укажите опцию "Добавить удаление таблицы, если таблица существует" (DROP TABLE IF EXISTS). Полученный файл, например dump.sql, переименуйте в dump_sql.txt. Это важно для дальнейших действий. Перед последующими манипуляциями не лишним будет сделать резервную копию файла.

Откройте полученный и переименованный файл с помощью Internet Explorer. Установите в браузере кодировку, в которой, на данный момент, сохранён дамп базы. Пролистайте файл, чтобы визуально убедиться в том, что кириллица читается нормально, и кодировка установлена верно. Затем в разделе меню "файл" выберите команду "сохранить как", установите "сохранить как текстовый файл" (проверьте: ни в коем случае не должно быть "как HTML"!!!) и, там же, выберите кодировку для сохранения. Кодировку меняете с существующей на ту, в которую Вы хотите перевести Ваш сайт. Жмёте "сохранить". Полученный файл опять просматриваете для визуального контроля на предмет того, что кодировка изменена на требуемую, и в тексте файла не появилось множества лишних тегов. Всякий "лишний мусор" в файле может появиться в том случае, если вы забыли сменить расширение файла на .txt и не проконтролировали то, что сохраняете файл именно "как простой текст".

Откройте файл в текстовом редакторе, задайте поиск текстового фрагмента с названием "старой" кодировки (например windows-1251) по всему файлу и замените найденные фрагменты старой кодировки на новую (например UTF-8). Это может быть актуально в том случае, если в базе хранятся установки и/или шаблоны с HTTP заголовками и/или перевод (локализация)...

Затем "вливаете" полученный после сохранения дамп на место, в базу данных. Теперь вся Ваша база данных конвертирована в другую кодировку.

Рекомендации по подготовительным операциям:

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

Как вариант, можно воспользоваться Webmin. Он позволяет не тащить дамп на локальный компьютер, а сохранить там же, на сервере, и затем "вливать" обработанный файл с диска на сервере, а не с локального компьютера.

Если такая возможность отсутствует, то тогда придётся обращаться к MySQL через командную строку.

/usr/local/mysql/bin/mysqldump -u root --password='password' --databases name_of_base > /path/to/file/dump.sql

Можно сразу заархивировать созданный дамп. В таком виде его целесообразней перетаскивать на локальный компьютер:

/usr/local/mysql/bin/mysqldump -u root --password='password' --databases name_of_base | gzip --best > /path/to/file/dump.gz

Возможные неприятности:

Если размер базы очень большой, то все манипуляции с файлом на локальном компьютере будут происходить очень медленно - запаситесь терпением и не делайте лишних непродуманных движений. Каждое Ваше действие может повергнуть компьютер в глубокую задумчивость, будьте к нему снисходительны. Если он не реагирует на Ваши нажатия - не торопите его, дайте ему возможность всё обдумать, выпейте кофе, сделайте необходимые телефонные звонки... Если соотношение размеров файла с производительностью Вашего компьютера не даёт ни малейшего повода для оптимизма, то существует второй способ, описанный ниже в этой статье (с помощью скрипта convert_charset.pl).

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

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

Название файла должно быть «convert_charset.pl»:

#!/usr/bin/perl
use Text::Iconv;
# Read list of files
@files = <*>;
foreach $file (@files) {
if (!($file eq "convert_charset.pl")) {
open(DUMP,"./$file") || die "$!\n";
@dump = <DUMP>;
close(DUMP);

$converter = Text::Iconv->new("utf8", "UTF-8");
#$converter = Text::Iconv->new("KOI8-R", "utf8");
#$converter = Text::Iconv->new("utf8", "KOI8-R");
#$converter = Text::Iconv->new("KOI8-R", "UTF-8");

@dump = $converter->convert("@dump");
open(DUMP,">$file") || die "$!\n";
print DUMP "@dump";
close(DUMP);
print "\n$file";
$dump = '';
}}

В листинге скрипта есть несколько закомментированных строчек с заготовками для разных пар кодировок. Уберите комментарий в той строке, которая Вам подходит и вставьте знак комментария перед всеми остальными парами. Для того, чтобы этот скрипт работал, у Вас на сервере должна быть установлена библиотека Iconv и перловый Cpan модуль Text::Iconv. Сама библиотека, как правило, на сервере уже есть, а сам модуль чаще всего отсутствует, поэтому его придётся установить. Наиболее комфортно это делать через Webmin.
Вручную это делается следующим образом: от имени суперпользователя в командной строке набираете :

perl -MCPAN -e shell
install Text::Iconv
exit

Устанавливаете созданному файлу (convert_charset.pl) права на запуск. Кладёте скрипт в папку, содержащую файлы, которые необходимо конвертировать, и запускаете его. Скрипт конвертирует все файлы, находящиеся в этой папке, в заданную кодировку, установленную Вами в коде программы. В процессе работы скрипт выводит на стандартный поток имена обработанных файлов.

Если папок с файлами, которые необходимо перекодировать, несколько, то перемещаете скрипт в следующую папку и повторяете операцию.
Файлы, которые могут нуждаться в перекодировке - это:

  • шаблоны,
  • файлы перевода интерфейса,
  • скрипты, которые содержат HTML код с фрагментами текста кириллицей,
  • ...

Вобщем любые файлы, которые так или иначе содержат фрагменты текста, который выводится пользователю кириллицей.

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

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

После этого дамп можно вернуть на место в базу:

mysql -uuser -ppassword name_of_base < /path/to/file/dump.sql

За сохранность англоязычного текста можете не переживать - он при любых перекодировках окажется "на своём месте". После окончания работ скрипт лучше переместить за пределы пространства файлов сайта.

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

После окончания всех операций не забудьте очистить кеш сайта, над которым выполнялись все эти действия. Возможно, придётся перезапустить Apache. Если при работе сайта задействован mod_perl или mod_fastcgi, то перезапуск обязателен.

Особенности при конвертации сайтов на основе WebGUI:

Для версии 5.5.*:

Все шаблоны и локализация (перевод интерфейса) находятся в базе данных. Перевод интерфейса для каждого из сайтов находится внутри базы данных каждого из этих сайтов, но при работе эта информация кешируется в одном и том же пространстве имён. Если пользователь открыл страницу одного из сайтов, то все встречающиеся слова и фразы локализации сохраняются в кеш. Если открыть страницу на другом сайте, то берутся уже существующие слова из кеша, а недостающие подтягиваются из базы. Таким образом, если у вас несколько сайтов с разной кодировкой, то в кеше это всё перемешивается. Поэтому: Вам придётся либо переводить все сайты на новую кодировку, либо при переводе только одного из сайтов изменить название языка. Например: Russian изменить на Russian_utf.

После переконвертации базы Вам необходимо будет изменить в настройках название кодировки (в дампе или уже непосредственно в базе). Если Вы переконвертировали только один сайт из существующих и изменили название языка, то необходимо поменять название языка в свойствах всех страниц этого сайта. Зачастую это удобнее сделать текстовым редактором в дампе базы данных после конвертации перед заливкой в базу данных.

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

Для версии 6.0.*:

Все действия аналогичны действиям с предыдущими версиями.

Для версии 6.1.*, 6.2.*:

Отличие этих версий состоит в том, что вся локализация и помощь по сайту удалены из базы и вынесены в отдельные файлы.

Все действия с дампом базы данных справедливы и для этих версий. Помимо базы данных необходимо будет конвертировать и файлы перевода, затем изменить название кодировки в файле /data/WebGUI/lib/WebGUI/i18n/Russian.pm

Вы можете это сделать любым текстовым редактором или с помощью специального скрипта для редактирования перевода.

Как и для предыдущих версий, необходимо перекодировать или все сайты или использовать отдельное название перевода для каждой кодировки (Russian, Russian_1251, Russian_UTF…).

Для версии 6.3.* и выше:

Начиная с версии 6.3.0 предусмотрено использование только одной кодировки - UTF-8. Если Вы хотите проапгрейдить сайт более ранней версии, то необходимо сначала перевести его в Юникод, а затем уже выполнять апгрейд.




На сайте установлена версия WebGUI:
7.8.24