С версии 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. Обновление
Сбросьте весь кеш;
Выйдите и зайдите заново на сайт чтобы обновить данные сессии.
Комментарии