Смена кодировки сайта
версия для печатиПереходим с windows-1251 на utf-8. Перекодирование затронет все: php-скрипты, статику (css, js, html), мета-теги, БД, настройки веб-сервера и PHP. Во-первых, подумайте дважды, прежде чем затевать смену кодировки. Так ли это вам нужно? У меня сайт маленький, самописный, опыта уже достаточно, и то я потратил несколько часов на эту процедуру. Во-вторых, создайте копию вашего сайта перед тем, как что-то менять. Получите дамп базы. Не удаляйте копию, даже если есть 100% уверенность, что все сделано правильно.
Скрипты
Используем iconv. Рекурсивно конвертируем все текстовые файлы. Убедитесь, что перекодирование коснется так же .htaccess. Важно правильно описать целевые файлы, iconv настолько крут, что перекодировал мне так же несколько jpeg, gif и favicon.ico в нечитабельный формат. Вот тут очень пригодилась копия сайта. Еще одна проблема: повторное кодирование utf-файла, в результате чего он покрывается кракозябрами. Воспроизвести еще раз не смог, но была у меня пара таких нежданчиков, откатил из копии.
В википедии приведен пример скрипта, используем его.
# !/bin/sh
find . -type f -name '*.htm' -o -name '*.php' -o -name '.htaccess' | while read i
do
echo $i
iconv -f WINDOWS-1251 -t UTF-8 "$i" > tmp
mv -f tmp "$i"
done
Аналогично перекодируем css/less/js или что там у вас есть. Можно все одним скриптом сделать, как угодно. Стоит помнить, что php-файлы должны быть в кодировке UTF-8 без BOM, но с этим у iconv нет проблем.
База
Открыл дамп в текстовом редакторе и перекодировал его в UTF-8 встроенным инструментом. У меня для этого Kate, на Винде можно использовать Nodepad++. Далее поиск и замена 'CHARSET=cp1251' > 'CHARSET=utf8'. Тут нужно быть аккуратным. Например, я в статьях блога использовал эти же слова и заменил все по запарке. Потом долго колупал win-копию базы, т.к. phpMyAdmin и MySQL Workbench плохо воспринимают win-1251 и получались разнообразные глюки. Кроме замены charset полезно проверить дамп на другие указания виндовской кодировки. Обратите внимание, теперь у вас и сам файл дампа в нужной кодировке и описания таблиц в нем указывают на UTF-8. После всего создаем новую БД
CREATE SCHEMA `my_base` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ciи загружаем в нее дамп в новой кодировке.
Доводка
Допиливаем вручную. Меняем у html-страниц мета-тег charset на utf-8. Лучше поиском в файлах, таких html-ок может оказаться несколько :) Проверьте .htaccess и php.ini (зависит от настроек хостинга), возможно там тоже задана кодировка. Например у меня было такое:
php_value default_charset windows-1251 # заменить utf-8Так же полезно сделать поиск по скиптам. У меня есть такая строка
.. mysqli_set_charset($con_id, 'cp1251') ..и пока там кодировку не сменил, тексты отображались кракозябрами, хотя БД уже была в UTF8. Причина очевидна :), но въехал я не сразу.
Проверить поиском функции:
- htmlspecialchars() - может быть указана кодировка;
- setlocale() - так же может быть задана кодировка;
- preg_*() - регулярки для мультибайтных строк пишутся с соответствующим модификатором 'u';
- функции типа strtolower() меняем на mb_strtolower(). Полный список функций для работы с мультибайтными строками тут;
Похожие материалы: Кодировки
Понравилась статья? Расскажите о ней друзьям: