Смена кодировки сайта
С версии main 24.0.0 продукты 1С-Битрикс полностью перешли на кодировку UTF-8. Однобайтовые установки более не поддерживаются.
Сменить кодировку поможет Мастер конвертации сайта в UTF-8. Или вы можете выполнить её вручную с помощью инструкции в уроке.
Внимание! Прежде чем приступить к конвертации сайта обязательно сделайте резервную копию сайта и базы данных. Настоятельно рекомендуем предварительно потренироваться выполнять конвертацию на отдельной копии сайта. Конвертация сайта сложная операция и каждый случай индивидуален. При её выполнении высока вероятность потерять важные данные, если что-то пойдет не так!
Общий порядок действий
Редактировать файлы и вносить правки на сервере можно подключаясь по SSH.
Рассмотрим общий порядок конвертации сайта с кодировки cp1251 в UTF-8:
-
В региональных настройках Настройки > Настройки продукта > Языковые параметры > Региональные настройки сменитe кодировку на UTF-8 для всех языков;
-
mbstring.func_overload до версии 20.100.0 модуля main До версии 20.100.0 требуется добавить в файл /.htaccessстроки:php php_value mbstring.func_overload 2 php_value mbstring.internal_encoding UTF-8С версии 20.100.0 Главного модуля (main) требуется удаление настройки PHP mbstring.func_overload. Эта опция более не требуется и не поддерживается платформой. -
Установите в файле настроек php.ini значение
default_charset = "utf-8";
Расположение файла настроек php.ini можно посмотреть заранее в административном разделе на странице Настройки PHP
Страница Настройки PHP (Настройки > Инструменты > Диагностика > Настройки PHP) служит для отображения информации о текущих настройках PHP.
Подробнее в курсе Администратор. Базовый (Loaded Configuration File) или с помощью PHP функции phpinfo().
Если сайт размещен на Хостинге, возможно понадобится обратиться к хостинг провайдеру для внесения этих настроек.
4. Добавьте в /bitrix/php_interface/dbconn.php
В этом же файле удалите строки, относящиеся к кодировке cp1251:
5. Установите значение 'value' => true для utf_mode в файле/bitrix/.settings.php:
6. Перекодируйте всю базу данных в UTF-8. Вероятнее всего придётся обращаться за помощью к администратору сервера.
7. Установите в файле /bitrix/php_interface/after_connect.php
и в файле /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.
/.htaccess:
9. Перекодируйте все файлы сайта в UTF-8.
10. Сбросьте весь кеш;
11. Выйдите и зайдите заново на сайт чтобы обновить данные сессии.
База данных
Для конвертации базы (БД) потребуется сменить кодировку самой базы, всех её таблиц и всех текстовых полей таблиц. НЕ выполняйте конвертацию БД из административной части. Используйте для этого другие доступные средства.
В простом случае (без сериализованных данных) перекодировать базу данных и все таблицы можно следующим образом:
- Изменить кодировку самой базы данных сайта:
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
;
Внимание: Если в базе данных хранятся сериализованные данные, то приведенный выше метод конвертации для них не подойдет. Используйте специальные методы / средства для конвертации таких данных.
Файлы
В простом варианте, когда все файлы сайта в кодировке cp1251, перекодировать их в UTF-8 можно выполнив такую команду в корневой папке сайта (для UNIX систем):
// переходим в корневую папку сайта. Например:
cd /var/www/html/
// выполняем команду для перекодирования файлов
find . -name '*.php' -type f -exec iconv -fcp1251 -tutf8 -o /tmp/tmp_file {} \; -exec mv /tmp/tmp_file {} \;
Важно:
- Способ не подходит для сайтов на нескольких языках, т.к. в таком случае в структуре будут присутствовать файлы в различных кодировках.
- Учитывайте особенности используемого вами Unix. Указанный выше пример может не сработать. В этом случае его надо адаптировать под вашу ОС. Например:
// выполняем команду для перекодирования файлов
find ./ -type f -name "*.php" -exec bash -c 'file="$1"; iconv -f cp1251 -t utf8 "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"' _ {} \;
Использование внешних программ или конвертация файлов вручную
Часто при использовании внешних программ для конвертации в файлы добавляется специальная последовательность символов, так называемый BOM. Эти символы должны находиться только вначале файла, а поскольку итоговая страница является составной из нескольких php файлов, то спецсимволы появляются в теле страницы. Если делаете конвертацию файлов вручную - не сохраняйте с BOM!
Бизнес-процессы
Шаблоны бизнес-процессов с переменными, константами и параметрами хранятся в сериализованном и запакованном виде в таблице b_bp_workflow_template, поэтому смена кодировки БД не повлияет на них. Чтобы привести их к нужной кодировке требуется выполнить дополнительные действия.
Сначала обязательно сделайте копию таблиц шаблонов b_bp_workflow_template одним из приведенных ниже способов:
- копированием с помощью SQL-запросов:
//создаём новую таблицу, аналогичную оригинальной
CREATE TABLE b_bp_workflow_template_bak LIKE b_bp_workflow_template;
// копируем данные в созданную таблицу
INSERT INTO b_bp_workflow_template_bak SELECT * FROM b_bp_workflow_template;
Следующим шагом выполните скрипт в командной PHP-строке, который изменит кодировку данных:
cmodule::includemodule("bizproc");
$connection = \Bitrix\Main\Application::getConnection();
$sql_select = "select * from b_bp_workflow_template";
$process = $connection->query($sql_select);
while ($r = $process->fetch())
{
$gztemp = $r['TEMPLATE'];
$gzvar = $r['VARIABLES'];
$gzconst = $r['CONSTANTS'];
$gzpar = $r['PARAMETERS'];
// Распаковываем данные по БП.
$serializedTemplate = @gzuncompress($gztemp);
$serializedVariables = @gzuncompress($gzvar);
$serializedConstants = @gzuncompress($gzconst);
$serializedParameters = @gzuncompress($gzpar);
// Рассериализуем данные по БП.
$serializedTemplate = @unserialize($serializedTemplate);
$serializedVariables = @unserialize($serializedVariables);
$serializedConstants = @unserialize($serializedConstants);
$serializedParameters = @unserialize($serializedParameters);
if ($serializedTemplate === false) continue;
// Меняем кодировку данных.
$serializedTemplate = $APPLICATION->ConvertCharsetArray(
$serializedTemplate,
'windows-1251',
'utf-8'
);
$serializedVariables = $APPLICATION->ConvertCharsetArray(
$serializedVariables,
'windows-1251',
'utf-8'
);
$serializedConstants = $APPLICATION->ConvertCharsetArray(
$serializedConstants,
'windows-1251',
'utf-8'
);
$serializedParameters = $APPLICATION->ConvertCharsetArray(
$serializedParameters,
'windows-1251',
'utf-8'
);
$r["TEMPLATE"] = $serializedTemplate;
$r["VARIABLES"] = $serializedVariables;
$r["CONSTANTS"] = $serializedConstants;
$r["PARAMETERS"] = $serializedParameters;
// Сохраняем обновленную информацию.
CBPWorkflowTemplateLoader::update(
$r["ID"],
[
'TEMPLATE' => $r['TEMPLATE'],
'VARIABLES' => $r['VARIABLES'],
'CONSTANTS' => $r['CONSTANTS'],
'PARAMETERS' => $r['PARAMETERS']
],
$r,
false,
false
);
}
Советы и ссылки
Основные шаги по конвертации сайта выполнены. Если после конвертации возникают ошибки при открытии сайта, включите режим отладки 'debug' => true в файле /bitrix/.settings.php. Это позволит видеть где и какие возникают ошибки.
Обязательно выполните проверку системы
Форма Проверка системы (Настройки > Инструменты > Проверка системы) предназначена для всесторонней проверки соответствия параметров системы, на которой осуществляется функционирование проекта, минимальным и рекомендуемым техническим требованиям продукта.
Подробнее в курсе Администратор. Базовый. . По результатам проверки будет видно, что ещё нужно исправить. Пользуйтесь подсказками под знаками вопроса справа.
Если возникли ошибки с таблицами базы данных (последняя строка проверки), можно посмотреть логи в журнале
. В конце файла логов будут указаны запросы, с помощью которых можно исправить эти ошибки. Перед началом исправления рекомендуется сделать копию базы данных.
Внимание! С версии 23.200.0 появился альтернативный путь смены кодировки - Мастер конвертации сайта в UTF-8. Он находится на странице списка мастеров /bitrix/admin/wizard_list.php?lang=ru. Все шаги его работы сопровождаются необходимыми пояснениями.
Список ссылок по теме:
- Конвертация сайта из cp1251 в UTF-8 (блог разработчиков);
- Выбор кодировки сайта;
- Настройка параметров ядра;
- Проверка системы в курсе Администратор. Базовый.
- Как изменить кодировку базы данных MySQL?.