Случилось мне повозиться над сменой кодировки проекта на Битриксе с windows-1251 (cp1251) на UTF-8 (utf-8). Расскажу как всё прошло.
1. Резервные копии файлов и БД
Сначала сделать все резервные копии: файлов сайта и базы данных, чтобы откатиться, если что-то пойдёт не так. У меня "не так" пошло :) и да резервные копии очень пригодились. Никогда не знаешь, чего ждать от битрикса.
2. php.ini и .htaccess
Попросить техподдержку вашего хостинга прописать в php.ini следующие строки (на REG.RU вы можете сами это сделать в папке php-bin/php.ini)
mbstring.func_overload=2
mbstring.internal_encoding=utf-8
В файл /.htaccess
добавить строки:
php_value mbstring.func_overload 2
php_value mbstring.internal_encoding UTF-8
3. Удалить модули поиска и веб-аналитики
Удалите модули "Поиск" без сохранения таблиц и "Веб-аналитика" (без сохранения таблиц, но с сохранением шаблонов сообщений).
4. Удалить букву ё
Удалить из словаря транслита в модуле "Форум" (Сервисы > Форумы > Фильтр нецензурных слов > Словарь транслита) букву 'ё', которая имеет ID = 7.
5. Перекодировать всю базу данных в UTF-8
Сменить кодировку базы данных, типов полей с cp1251 на utf8: это можно делать на сервере или локально. Я делал локально, потом импортировал базу уже исправленную в кодировку utf8. Здесь в помощь команда
SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as
sqlcode
FROM `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` = 'database_name' ORDER BY 1
где database_name - имя вашей база данных.
Этот запрос выведет на страницу новый запрос, который нужно будет выполнить на этой же странице.
Копируйте все строки нового запроса (выбрав выводить все запросы на одной странице) и выполните полученный новый запрос. По завершении выполнения все таблицы базы будут переведены в кодировку UTF-8.
Проверить и посмотреть какая кодировка у таблиц в БД можно через phpmyadmin, выполнив SQL
SHOW VARIABLES LIKE 'char%';
и
SHOW VARIABLES LIKE 'collation%'
а поменять, если где-то увидите latin1 можно командой
set collation_server = 'utf8_general_ci';
6. after_connect
Пропишите в /bitrix/php_interface/after_connect.php
$DB->Query("SET NAMES 'utf8'");
$DB->Query('SET collation_connection = "utf8_unicode_ci"');
Пропишите в /bitrix/php_interface/after_connect_d7.php:
$connection->queryExecute("SET NAMES 'utf8'");
$connection->queryExecute('SET collation_connection = "utf8_unicode_ci"');
7. Пропишите в /bitrix/.settings.php:
return array (
'utf_mode' =>
array (
'value' => true,
'readonly' => true,
),
8. Сходите на турники сделайте подтягивания
9. Рекурсивная смена кодировки файлов в папке и вложенных папках с windows-1251 в UTF-8 (utf8).
Можно вручную в среде разработки, а можно скриптом по ssh. Создаем файл iconv.sh с содержимым:
# !/bin/sh
find $1 -type f -name '*.'$2 -o -name '*.'$2 | while read i
do
echo $i
iconv -f cp1251 -t utf8 -o "$i.new" "$i" &&
mv -f "$i.new" "$i"
done
Тут может возникнуть дальше ошибка, если вы создали файл в Windows. Может такая ошибка выдаться при попытке запустить скрипт уже на сервере:
sh done syntax error unexpected token 'done'
или такая
line 8: syntax error: unexpected end of file
Надо просто убрать лишние невидимые символы <CR>, которые добавил windows в ваш файл.
Наберите od -a test.sh, чтобы увидеть эти символы невидимые.
$ od -a test.sh
0000000 # ! / b i n / b a s h cr nl # sp cr
0000020 nl w h i l e sp : cr nl d o cr nl sp sp
0000040 sp sp e c h o sp " P r e s s sp [ C
0000060 T R L + C ] sp t o sp s t o p " cr
0000100 nl sp sp sp sp s l e e p sp 1 cr nl d o
0000120 n e cr nl
0000124
Из-за них файл не исполняется, вот как windows подпортил наш файл sh. Можете выполнить команду для вашего файла, которая очистит его.
$ dos2unix test.sh
Но если этой функции не установлено на сервере, то создайте файлик через консоль.
Открыть новый файл с именем iconv2.sh
nano -w iconv2.sh
Введите код, вручную напечатайте
# !/bin/sh
find $1 -type f -name '*.'$2 -o -name '*.'$2 | while read i
do
echo $i
iconv -f cp1251 -t utf8 -o "$i.new" "$i" &&
mv -f "$i.new" "$i"
done
Для выхода и сохранения файла нажмите
CTRL+X потом Y и потом Enter
Сделайте файл исполняемым командой (Нужно дать этому файлу разрешение на выполнение как программы.)
chmod +x iconv2.sh
Далее через терминал запускаем наш скрипт
sh iconv2.sh folder js
sh – запускает сам скрипт
iconv.sh – название файла скрипта
folder – путь к той папке, файлы которой нам нужно перекодировать, этот путь может выглядеть так, например, ../server/project – перекодирует все файлы в папке server/project, которая находиться в домашней директории юзера (пользователя системы)
js – расширение файлов, которые нужно переконвертировать.
10. dbconn
В файл /bitrix/php_interface/dbconn.php
добавить строки:
define("BX_UTF", true);
11. Админка Битрикса
В админке битрикса изменить в настройках языка ru кодировку с windows-1251 на utf-8
12. Очистить кеш сайта, выйти и войти в админку
13. Установить модуль поиска и сделать переиндексацию
Ну и всё.
Ссылки: