Переход сайта 1С Битрикс с кодировки CP1251 (Windows-1251) на UTF-8

  • 452
   
Разделы

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


По возможности указываю ссылки на источники.


Копируйте, комментируйте, переделывайте, пользуйтесь. Кому не жалко, оставляйте ссылку на источник.

Частный вебмастер по разработке сайтов на 1С Битрикс и WordPress

С версии main 24.0.0 продукты 1С-Битрикс полностью перешли на кодировку UTF-8. Однобайтовые установки более не поддерживаются. Сменить кодировку поможет Мастер конвертации сайта в UTF-8. Или вы можете выполнить её вручную с помощью инструкции в уроке.

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

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

Шаг 1. Региональные настройки

В региональных настройках Настройки > Настройки продукта > Языковые параметры > Региональные настройки сменитe кодировку на UTF-8 для всех языков;

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

Установите в файле настроек php.ini значение

default_charset = "utf-8"

Шаг 3. Настройки подключения к базе данных

Добавьте в /bitrix/php_interface/dbconn.php

define("BX_UTF", true);

В этом же файле удалите строки, относящиеся к кодировке cp1251:

setlocale(LC_ALL, 'ru_RU.CP1251');
mb_internal_encoding("Windows-1251");

Установите значение 'value' => true для utf_mode в файле /bitrix/.settings.php

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

Установите в файле /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

$this->queryExecute("SET NAMES 'utf8'");
$this->queryExecute('SET collation_connection = "utf8_unicode_ci"');
//До версии main 22.0 вместо $this использовалась переменная $connection.

Шаг 4. Настройки  htaccess

Установите в /.htaccess

php_value default_charset utf-8

Шаг 5. Перекодировка базы данных

Подключитесь к своей базе данных под пользователем имеющим право на внесение правок. Не забываем про резервное копирование

Изменить кодировку самой базы данных сайта:

ALTER DATABASE имя_базы_данных charset=utf8;

Изменить кодировку соединения с базой данных:

SET NAMES 'utf8'
ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

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` = 'имя_базы_данных'
ORDER BY 1
;

В качестве ответа получим список запросов вида:

ALTER TABLE `имя_базы_данных`.`имя_таблицы` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `имя_базы_данных`.`имя_таблицы` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `имя_базы_данных`.`имя_таблицы` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `имя_базы_данных`.`имя_таблицы` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Копируем и выполняем все запросы. База данных и таблицы перекодированы.

Шаг 6. Перекодировка файлов. Мой скрипт)))

В корневой директории сайта создаем файл со следующим содержимым

<?require($_SERVER['DOCUMENT_ROOT']."/bitrix/header.php"); 

echo '<pre>';
// Путь откуда начинаем
$directory = $_SERVER["DOCUMENT_ROOT"] . '/';
// $directory = $_SERVER["DOCUMENT_ROOT"] . '/bitrix/templates/'; // если тут лежат шаблоны
echo $directory;

// Массив путей для пропуска
$skipPaths = [
$_SERVER["DOCUMENT_ROOT"] . '/upload/',
$_SERVER["DOCUMENT_ROOT"] . '/bitrix/',
];

function checkAndConvertToUtf8($dir, $skipPaths) {
$files = scandir($dir);

foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;

$path = $dir . '/' . $file;

// Пропускаем файлы и директории из списка $skipPaths
if (in_array($path, $skipPaths)) {
echo "Путь $path пропущен\n";
continue;
}

// Проверяем, является ли элемент файлом с допустимым расширением
$allowedExtensions = ['php', 'js', 'css'];
$fileExtension = pathinfo($path, PATHINFO_EXTENSION);

if (is_dir($path)) {
// Рекурсивно обрабатываем поддиректории
checkAndConvertToUtf8($path, $skipPaths);
} elseif (is_file($path) && in_array($fileExtension, $allowedExtensions)) {
$content = file_get_contents($path);

// Определяем кодировку файла, учитывая Windows-1251 и CP1251
$encoding = mb_detect_encoding($content, ['CP1251', 'Windows-1251', 'UTF-8'], true);

if ($encoding === 'CP1251' || $encoding === 'Windows-1251') {
// Перекодируем из CP1251/Windows-1251 в UTF-8
$contentUtf8 = mb_convert_encoding($content, 'UTF-8', 'CP1251');
file_put_contents($path, $contentUtf8);
echo "Файл $path перекодирован из CP1251/Windows-1251 в UTF-8\n";
} elseif ($encoding === 'UTF-8') {
// Файл уже в UTF-8, пропускаем
echo "Файл $path уже в UTF-8, пропускаем\n";
} else {
// Файл в другой кодировке
echo "Файл $path имеет неизвестную кодировку ($encoding), обработка пропущена\n";
}
}
}
}

// Запуск функции
checkAndConvertToUtf8($directory, $skipPaths);
echo '</pre>';

require($_SERVER['DOCUMENT_ROOT']."/bitrix/footer.php"); ?>

$directory путь откуда начинаем рекурсивную перекодировку. Если у вас шаблоны в /bitrix/templates/, то после первого запуска меняем путь в $directory на этот и еще раз выполняем файл. Файл выполняется тупо открытием его в браузере. Смотрите вывод.

Шаг 7. Обновление

Сбросьте весь кеш;

Выйдите и зайдите заново на сайт чтобы обновить данные сессии.

Комментарии

Комментарий отправлены на валидацию!

Теги: