337  /  382
Справочник

Смена кодировки сайта

Просмотров: 62994
Дата последнего изменения: 09.10.2024
Марина Павлова
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

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

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

  Общий порядок действий

  Редактировать файлы и вносить правки на сервере можно подключаясь по SSH.

Рассмотрим общий порядок конвертации сайта с кодировки cp1251 в UTF-8:

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

  2. mbstring.func_overload до версии 20.100.0 модуля main

  3. Установите в файле настроек php.ini значение default_charset = "utf-8";

    Расположение файла настроек php.ini можно посмотреть заранее в административном разделе на странице Настройки PHP Страница Настройки PHP (Настройки > Инструменты > Диагностика > Настройки PHP) служит для отображения информации о текущих настройках PHP.

    Подробнее в курсе Администратор. Базовый
    (Loaded Configuration File) или с помощью PHP функции phpinfo().

    Если сайт размещен на Хостинге, возможно понадобится обратиться к хостинг провайдеру для внесения этих настроек.

  4. Добавьте в /bitrix/php_interface/dbconn.php
    define("BX_UTF", true);
    

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

    setlocale(LC_ALL, 'ru_RU.CP1251');
    mb_internal_encoding("Windows-1251");
    
  5. Установите значение 'value' => true для utf_mode в файле /bitrix/.settings.php:
    utf_mode =>
    	array(
    		'value' => true,
    		'readonly' => true,
    	),
    
  6. Перекодируйте всю базу данных в UTF-8. Вероятнее всего придётся обращаться за помощью к администратору сервера.
  7. Установите в файле /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.
  8. Установите в /.htaccess:
    php_value default_charset utf-8
    
  9. Перекодируйте все файлы сайта в UTF-8.
  10. Сбросьте весь кеш;
  11. Выйдите и зайдите заново на сайт чтобы обновить данные сессии.

  База данных

Для конвертации базы (БД) потребуется сменить кодировку самой базы, всех её таблиц и всех текстовых полей таблиц. НЕ выполняйте конвертацию БД из административной части. Используйте для этого другие доступные средства.

В простом случае (без сериализованных данных) перекодировать базу данных и все таблицы можно следующим образом:

  • Изменить кодировку самой базы данных сайта:
    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;
    
  • Выполните все запросы. База данных и таблицы перекодированы.

Внимание: Если в базе данных хранятся сериализованные данные, то приведенный выше метод конвертации для них не подойдет. Используйте специальные методы / средства для конвертации таких данных.

  Файлы

В простом варианте, когда все файлы сайта в кодировке 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 {} \;

Важно:
  1. Способ не подходит для сайтов на нескольких языках, т.к. в таком случае в структуре будут присутствовать файлы в различных кодировках.
  2. Учитывайте особенности используемого вами 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 одним из приведенных ниже способов:

  1. копированием с помощью 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;
    
  2. созданием полной резервной копии базы данных.

Следующим шагом выполните скрипт в командной 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. Все шаги его работы сопровождаются необходимыми пояснениями.

Список ссылок по теме:



25
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии