29.01.2023

Смена кодировки Битрикс с Windows-1251 на UTF-8

Все еще существуют старые проекты, где используется кодировка windows-1251 (она же cp1251, она же cyrr).  Итак, в связи с отсутствием поддержки многих языков у win-1251, или ошибок в валидации, или же просто, решив сменить специализированную кодировку на более общую, вы нашли данный материал. Ну что ж, разберем по шагам, как сменить кодировку сайта (базы данных и файлов).

Шаг 1. Делаем бекап

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

Заходим в админ-панель Битрикс. Идем в "Настройки" - "Инструменты" - "Резервное копирование" - "Создание резервной копии". Ставим сохранять локально в папку, переходим на вкладку "Параметры". Проставляем настройки, как на рис. 1. За исключением пароля, лучше конечно поставить. Но можно и не ставить, только потом не забыть нужно удалить ее.

01.png

Рис. 1. Настройки резервного копирования средствами Битрикс

Шаг 2. Настройка хоста

Без разницы хостинг у вас или vds, это считается хостом, и его нам нужно настроить на новую кодировку UTF-8. Наша задача прописать следующее:


mbstring.internal_encoding = UTF-8
mbstring.func_overload = 2
  •  Если у вас хостинг, находим в настройках сайта переменные среды или его параметры, где должна быть возможность добавить/изменить переменные.
  • Если у вас vds, то в зависимости от того, как у вас установлен php, находим свой файл php.ini. И добавляем/меняем в нем настройки. Самый простой способ его найти, это создать файлик с выводом настроек. Например, файл info.php, который содержит: <?php phpinfo(); ?>. Переходим по пути, где он лежит и ищем строку "Loaded Configuration File", которая подскажет прямой путь до файла php.ini от корня хост-машины.

Шаг 3. Настройка сайта

Интересный момент, который нужно тоже рассмотреть. Дело в том, что возможно некорректная конвертация буквы "ёЁ". Чтобы все было в порядке, нужно снести модули "Поиск" и "Веб-аналитика".  Итак, модули лежат по пути в админке сайта:  "Настройки" - "Настройки продукта" - "Модули".

Находим сначала модуль "Поиск", жмем "Удалить". Снимаем галку "Сохранить таблицы" (иначе останется все от кодировки windows-1251), жмем "Удалить модуль".  То же самое, проделываем с модулем "Веб-аналитика", но оставляем сохранение шаблонов сообщений.

Меняем кодировку в региональных настройках сайта. Идем по пути "Настройки" - "Настройки продукта" - "Языковые параметры" - "Региональные настройки". Если у вас несколько региональных настроек (например, это могут быть русский, белорусский, казахский и т.д.), то заходим в каждый набор, и меняем настройку "Кодировка" с "windows-1251" на "UTF-8" (рис. 2). 

02.png

Рис. 2. Настройка региональных настроек

Сохраняем и появляются в админке знаки вопроса (рис. 3), ничего страшного, далее уберем их. Кстати, если вдруг кто-то наткнулся на этот материал по запросу "сбилась кодировка в админке Битрикс", то проверьте региональные настройки. В полне вероятно, что там что-то стоит не то.

03.png

Рис. 3. Сбившаяся кодировка в админке Битрикс

На этом настройка сайта через админку завершена, переходим к следующему шагу.

Шаг 4. Меняем файлы сайта

Заходим по SFTP/FTP. Находим файл /bitrix/php_interface/dbconn.php, меняем/добавляем:

define('BX_UTF', true);

После чего сохраняем изменение.

Находим следующий файл /bitrix/.settings.php. Находим блок:

'utf_mode' => 
  array (
    'value' => false,
    'readonly' => true,
  ),

Меняем его на:

'utf_mode' => 
  array (
    'value' => true,
    'readonly' => true,
  ),

Сохраняем.

Теперь задача: сменить кодировку файлам сайта. Можно делать удобным для вас способом. Рассмотрим вариант через файл convert_utf8.php (ссылка на зеркало, только переименуйте его ). Загружаем его в корень вашего сайта (т.е. он должен лежать рядом с index.php) и переходим на него в браузере (рис. 4). Если словили ошибку, то вам подскажет, что например на сайте нет mbstring.func_overload, значит нужно разобраться с ошибкой, а потом переходить.

04.png

Рис. 4. Шаг 1 конвертации сайта в utf8

Итак, сначала жмем на "Проверка прав доступа", ждем. Если все в порядке с правами, то отобразится, что шаг 1 выполнен успешно (рис. 5). Иначе, выведет список файлов, недоступных к редактированию.

05.png

Рис. 5. Проверка прав успешно пройдена

На шаге 2, жмем "Конвертация файлов в UTF8".  Ждем, после успешного выполнения скрипта по конвертации файлов, появится сообщение "Шаг 2 выполнен успешно" (рис. 6)

06.png

Рис. 6. Конвертация файлов успешно завершена

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

Итак, жмем на "Конвертация базы данных в UTF8". 

Ждем, в зависимости от объема данных, содержащихся в базе, это займет некоторое время. Таблицы будут поочередно конвертироваться (рис. 7).

07.png

Рис. 7. Конвертация базы данных

После конвертации базы данных, в случае успеха будет выведено "Конвертация завершена" (рис. 8). 

08.png

Рис. 8. Конвертация базы данных завершена

Если у вас выскочит ошибка, или большой объем базы, тогда работаем вручную. Для этого соберем список команд для выполнения. В панели администратора по пути "Настройки" -  "Инструменты" -  "SQL запрос" (рис. 9) вставляем запрос на получение команд по конвертации таблиц (заменяя database_name на имя вашей базы данных):

SELECT CONCAT('ALTER   TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;') as

sqlcode

FROM `information_schema`.`TABLES` t

WHERE 1

AND t.`TABLE_SCHEMA` = 'database_name' ORDER BY 1

09.png

Рис. 9. Получение команд для каждой таблицы

После того как получили все таблицы, копируем все записи, и выполняем их. После завершении процедуры конвертации, все таблицы будут переведены в UTF-8

Процесс конвертации базы данных завершен. Находим файл /bitrix/php_interface/after_connect.php. В нем:

$DB->Query("SET NAMES 'cp1251'");

Меняем на:

$DB->Query("SET NAMES 'utf8'");
$DB->Query('SET collation_connection = "utf8_unicode_ci"');

Сохраняем.

Также, если есть файл /bitrix/php_interface/after_connect_d7.php, то в нем:


$connection->queryExecute("SET NAMES 'cp1251'");

Меняем на:


$connection->queryExecute("SET NAMES 'utf8'");
$connection->queryExecute('SET collation_connection = "utf8_unicode_ci"');

Шаг 5. Чистка концов

Теперь почистим концы. 

Для этого удаляем файл /convert_utf8.php.

Очищаем весь кеш сайта в админке "Настройки" - "Настройки продукта" - "Автокеширование" - "Очистка файлов кеша":  "Все" -> "Начать".

Далее, произведем авторизацию заново, выйдя и зайдя в учетную запись.

Восстановим удаленные модули из шага 3. Заходим в "Настройки" - "Настройки продукта" - "Модули", находим модуль "Поиск", жмем "Установить". Далее нужно сделать переиндексацию "Настройки" - "Поиск" - "Переиндексация". Ставим "Шаг" в 1 секунду, жмем "Переиндексировать" (рис. 10). Процесс не быстрый, если файлов много и слабое железо, то процесс может затянуться. Но придется  дождаться завершения.

10.png

Рис. 10. Настройки переиндексации

Затем еще раз чистим кеш сайта:  "Настройки" - "Настройки продукта" - "Автокеширование" - "Очистка файлов кеша":  "Все" -> "Начать".

Процесс перевода сайта на Битрикс из кодировки windows-1251 в utf-8 завершен.

P.s. если вы используете дополнительные модули, например "Почта", то нужно проверить настройки внутри сервиса на каждом ящике, где проставить в его настроках "Кодировка, в которую конвертировать входящую почту" в "использовать кодировку сайта"