Как стать автором
Обновить

В помощь вебмастеру: Linux bash скрипт для перевода сайта на новую кодировку

Время на прочтение 3 мин
Количество просмотров 1.8K
«Лучше день потерять, потом за час долететь» © Крылья, ноги, хвост

Не так давно мне «посчастливилось» перевести веб сайт средних размеров из одной кодировки в другую. Если быть точнее из windows-1251 на UTF-8. Потом еще один — побольше, на третьем я сломался, и следуя верному принципу вышесказанного мне пришлось потерять кучку времени на написание скрипта по автоматизации этого процесса, но зато потом, за час я все-таки долетел.

Настраиваемые параметры скрипта следующие:
Исходные параметры:
SDIR="/usr/local/apache2/htdocs/site.ru/" — исходная директория сайта с символом слеша / в конце
SCP=«CP1251» — исходная (from) кодовая страница для iconv
EXT=".*\.(htm[l]*|php[3]*|js|css)$" — расширения файлов для перекодировки (здесь будут задействованы такие как .htm, .html, .php, .php3, .js, .css)
FCS=«windows-1251» — название исходной кодовой страницы для замены мета charset= в файлах

Целевые параметры:
DROP_STRUCT=true — принимает значения false, true, регулируя условие: должна ли при старте вычищаться целевая директория

DDIR="/usr/local/apache2/htdocs/new.site.ru/" — целевая директория сайта с символом слеша / в конце (должна существовать)
DCP=«UTF-8» — целевая (to) кодовая страница для iconv
TCS=«UTF-8» — название целевой кодовой страницы для замены мета charset= в файлах

А вот собственно и сам скрипт:

#!/bin/bash

# --- CONFIG SECTION ---

# Source Dir's params

SDIR="/usr/local/apache2/htdocs/site.ru/"    # with slash '/' in the end
SCP="CP1251"        # codepage for 'iconv'
EXT=".*\.(htm[l]*|php[3]*|js|css)$"    #files extensions for coding
FCS="windows-1251"    # charset for replace

# Destination Dir's params

DROP_STRUCT=true    # false, true

DDIR="/usr/local/apache2/htdocs/new.site.ru/"    # with slash '/' in the end
DCP="UTF-8"        # codepage for 'iconv'
TCS="UTF-8"        # new charset

# --- END CONFIG SECTION ---

# Drop structure
#
if $DROP_STRUCT
then
    rm -dfr $DDIR*
fi

# Make new copy
#
cp -aR $SDIR* $DDIR

# Flush miscoded files
#
find $DDIR -type f | grep -E "$EXT" | xargs -i rm -f {}

# Convert From To
#
find $SDIR -type f | grep -E "$EXT" | sed "s#$SDIR##" | xargs -i echo {} | \
while read f
do
iconv -c -f $SCP -t $DCP -o "$DDIR$f" "$SDIR$f"

# Revert MODE & OWNER
chmod `find "$SDIR$f" -maxdepth 0 -printf "%m"` "$DDIR$f"
chown `find "$SDIR$f" -maxdepth 0 -printf "%u:%g"` "$DDIR$f"

# Replace strings
perl -pi -e "s#content\s*\=\s*[\"'].*?charset\s*=\s*$FCS.*?[\"']#content=\"text/html; charset=$TCS\"#g" "$DDIR$f"
done


А теперь, еще несколько полезных моментов.

1. Возможно даже после перекодировки в UTF-8 и замены meta content на charset=UTF-8 Вы все равно видите абракадабру или не то, что хотелось бы. Здесь все дело в том, что для нового сайта в UTF-8 необходимо заменить параметр default_charset для самого PHP, т.к. в глобальных переменных он явно установлен для другой кодовой страницы (windows-1251). Я делаю это в настройках виртуального хоста (httpd.conf) через:

php_admin_value default_charset UTF-8

2. Как правило, сейчас любой сайт хочет базы данных, которые Вам то-же надо будет перевести в UTF-8. Особого труда это не составляет, если под рукой есть phpMyAdmin или mysqldump, на крайний случай, для гиганских БД, наверняка придется писать скрипт конвертации и временно приостанавливать сервис. Простота идеи должна быть понятна: делаем дамп БД, перекодируем его с помощью того-же iconv и заменяем все, что связано с кодовыми страницами на желаемые данные, заливаем все в новую БД.

Еще более правильный вариант предложенный 4m@t!c сделать это на тестируемой БД с помощью ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

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

mysql_query(«SET NAMES 'utf8'»);

Либо поменять default-character-set и default-collation для MySQL, если такое позволительно.

Помните!!! Подходите к таким переводам серьезно, сперва выполняя их на параллельной версии сайта и тестируйте, тестируйте, тестируйте.

Удачных переводов!

Источник: Записки под рукой
Теги:
Хабы:
+14
Комментарии 26
Комментарии Комментарии 26

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн