Сразу оговорюсь, что данный пост не претендует на статус официального документа, это должно быть хорошее подспорье по проблеме.
[spoiler]
Подготовка
- Для работы сайта на битрикс в utf8 абсолютно необходимо наличие модуля mbstring в php (это есть почти на любом хостинге) и установка параметра
mbstring.func_overload 2
С этим может быть проблема т.к. с версии php 5.2.8 параметр меняется глобально на весь сервер (). Уточните вопрос у хостера, но будьте осторожны если вам предложат CGI (см. ).
На VPS/выделенном сервере параметр без проблем меняется в php.ini. - Обязательно сделайте резервную копию работающего сайта, а лучше именно на копии проводите эксперименты. Если что-то пойдёт не так - вы можете потерять данные!
Этапы перехода
- Подготовить сервер как показано выше
- Добавить в /bitrix/php_interface/dbconn.php
define("BX_UTF", true); - Установить в /bitrix/.settings.php
utf_mode => array('value' => true, 'readonly' => true) - Изменить в настройках сайта кодировку с windows-1251 на utf-8
- Изменить в настройках языка ru кодировку с windows-1251 на utf-8
- Конвертировать все файлы в utf8
- Конвертировать БД в utf8
- Сменить в /bitrix/php_interface/after_connect.php на
$DB->Query("SET NAMES 'cp1251'";); и в файле /bitrix/php_interface/after_connect_d7.php$DB->Query("SET NAMES 'utf8'";); $connection->queryExecute("SET NAMES 'utf8'");
$connection->queryExecute('SET collation_connection = "utf8_unicode_ci"'); - Сбросить весь кеш
- Выйти и зайти на сайт чтобы обновить данные сессии
Практическая сторона вопроса
После смены кодировки сайта публичная часть принимает вид:
Это нормально, браузер пытается показать данные не в той кодировке. Теперь после всех действий внешний вид восстановится, и мы увидим, что процесс прошёл успешно.
Большое число файлов надо конвертировать по шагам, для этого буду использовать . По большому счёту, тут надо только переделать функцию замены в конвертацию через mb_convert_encoding.
Примечание. Часто при использовании внешних программ для конвертации в файлы добавляется специальная последовательность символов, т.н. . Эти символы должны находиться только вначале файла, а поскольку итоговая html страница является составной из нескольких php файлов, то спецсимволы появляются в теле html страницы. Если делаете вручную - не сохраняйте с BOM!
Для конвертации базы надо сменить кодировку базы, всех таблиц и всех текстовых полей таблиц. Вручную это тоже делать не очень удобно. Решил сделать конвертацию файлов и базы в одном скрипте.
Скрипт выполняет операции:
| - Конвертировать все файлы в utf8 - Конвертировать БД в utf8 |
Остальное следует делать вручную по списку в том порядке, как написано.
Можно скачать по ссылке:
В итоге получил картинку
Теперь, словно, девушка даже слегка улыбнулась

Обновление от 20.02.2012
- Теперь конвертируются все файлы, не только языки. При этом делается авто определение кодировки файла, а значит можно выполнять конвертацию повторно.
- Для кодировки базы указывается сравнение utf8_unicode_ci (требуется продуктом).
- Исправлены ошибки конвертации базы.
- Шаг конвертации файлов можно пропустить.
Дополнение от 10.09.2018
Если вы использовали интеграцию с почтой, проверьте настройки ящиков, если там установлена кодировка, переключите кодировку сайта.
Что с этим делать? Сайт сейчас в "кракозябах" а инфа из ИБ, то есть из БД, нормально отображается!
Вылечить сайт помог следующий рецепт. Очень надеюсь, что он поможет и еще кому-то.
Обновить ядро и перезагрузить только файлы PHP Битрикса возможно повторно. Для этого необходимо перейти на страницу обновления и в адресную строку добавить ключ:
/bitrix/admin/update_system.php?BX_SUPPORT_MODE=Y
Появится окно и кнопка, чтобы перезагрузить все модули и ядро PHP Битрикса.
Если что-то пошло не так при обновлении, то нужно воспользоваться инструментом"Настройки" - "Инструменты" - "Проверка сайта". При проверке система выдаст все замечания и оставшиеся ошибки.
Данное лекарство нашла в сети, датировано 2013 годом. Инструмент у меня сработал прекрасно, вся админка вернулась в нормальный вид, ошибок на сайте и в базе обнаружено не было. Надеюсь, что еще кому-то поможет, так как сама настрадалась с конвертацией и понимаю всю боль
после перекодировки в utf-8 открылась проблема с бизнес процессами: в дизайнере бизнес процессов теперь ромбики, в параметрах тоже
Когда запускается БП, то вместо параметров пустые строки
как исправить, кто подскажет?
После смены кодировки возникает ошибка структуры базы данных.
Дела несколько раз, результат одинаковый: Структура базы данных имеет ошибки. Всего 137, автоматически могут быть исправлены: 0
Например:
2019-Jan-23 12:05:20 Структура базы данных (check_mysql_table_structure): Ok
0% done
В таблице b_search_content поле URL "`URL` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`URL` text NULL DEFAULT NULL"
В таблице b_search_content поле TITLE "`TITLE` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`TITLE` text NULL DEFAULT NULL"
В таблице b_search_content поле TAGS "`TAGS` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`TAGS` text NULL DEFAULT NULL"
В таблице b_search_content поле PARAM1 "`PARAM1` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`PARAM1` text NULL DEFAULT NULL"
В таблице b_search_content поле PARAM2 "`PARAM2` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`PARAM2` text NULL DEFAULT NULL"
В таблице b_search_content_site поле URL "`URL` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`URL` text NULL DEFAULT NULL"
В таблице b_search_custom_rank поле PARAM1 "`PARAM1` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`PARAM1` text NULL DEFAULT NULL" В таблице b_search_custom_rank поле PARAM2 "`PARAM2` mediumtext NULL DEFAULT NULL" не соответствует описанию на диске "`PARAM2` text NULL DEFAULT NULL"
Что с этим можно сделать?
"Добрый день,
В данном случае, если была конвертация через инструкцию мы не поддерживаем такие изменения потому-что проходят со стороны сервера. Ситуация по обновлению по стандартному методу мы можем рассматривать, но в данном случае ситуация уже со стороны сервера. Рекомендую откатить, и сделать стандартное обновления, и после мы можем рассматривать что именно не так там происходит. Но в данном случае обновления должно быть сделано по стандартному функционалу."
Как вы понимаете, поморщи ждать не стоит...
(((
И готовьтесь к тому, что у вас могут возникнуть проблемы с "падающей" БД.
Пришлось только заново все службы доставки переустановить.
$connection->queryExecute('SET collation_connection = "utf8_unicode_ci"');
Все сделал норм.
Столкнулся с затруднением. База частично была в UTF-8 или выглядела так, хрен знает почему, история умалчивает.
В общем, при запуске, скрипт писал, что база уже в UTF и работать не хотел.
Пришлось просто отключить эту ошибку.
В итоге все законвертилось как надо.
СПАСИБО!
/bitrix/php_interface/after_connect.php
$DB->Query("SET collation_connection = 'utf8_unicode_ci'");
Проверяем, что хостинг имеет mbstring.func_overload 2
Проверка через настройку php в административной части Битрикс
Master и Local должны иметь значение 2.
Если local равен 0, то значит при установке сайта в папке
/etc/httpd/bx/conf/ в конфигурационном файле bx_ext_каталог_сайта.conf
прописалась кодировка windows-1251
php_admin_value mbstring.func_overload 0
php_admin_value default_charset latin
Эти две строки нужно закомментировать.
Попробовали провести конвертацию с помощью этого скрипта нашего сайта , работающего на последней версии продукта, установлен стандартный интернет магазин битрикс.
Версия Битрикс 20.0.700. Редакция Бизнес.
В результате сконвертировались не все файлы. Некоторые языковые файлы подправили специалисты хостинга (отображались знаки вопроса).
Внешне вроде сайт работает и все отображается нормально, но при попытке открыть на просмотр некоторые файлы, например, файлы других установленных языковых версий /ua через панель хостинга, они открываются только в старой кодировке 1251. Т.е. явно не все перекодировалось.
Работает ли скрипт корректно на текущей версии Битрикс? Возможно ли как-то проверить все ли файлы перекодировались и найти неперекодированные и сделать это повторно?
Как лучше поступить?
Спасибо.
В моём случае не всё сработало. Опишу что не получилось (всё я пока не проверил, описываю только то, что сразу заметно):
При переводе файлов не были переведены некоторые файлы включаемых областей, например /local/templates/2019/include_areas/main/disc1_1.php.
В том же каталоге (возможно проблема в названиях): disc9.php, head1.php, key1.php, key1.php
Так же не были конвертированы несколько полей таблиц (обе таблицы были пусты)
2020-Jun-22 09:33:55 Кодировки таблиц в БД (check_mysql_table_charset): FailКодировка поля "INDEXED" таблицы "b_translate_file" (cp1251) отличается от кодировки базы (utf8)
Кодировка поля "IS_LANG" таблицы "b_translate_path" (cp1251) отличается от кодировки базы (utf8)
Кодировка поля "IS_DIR" таблицы "b_translate_path" (cp1251) отличается от кодировки базы (utf8)
Кодировка поля "INDEXED" таблицы "b_translate_path" (cp1251) отличается от кодировки базы (utf8)
Повторный запуск скрипта не исправил ситуацию.
Остатки я добью вручную, это просто фидбек, если у вас будет желание доработать скрипт ))
И ещё мне мешала инструкция
$res = $DB->Query('SHOW VARIABLES LIKE "character_set_results"');
$f = $res->Fetch();
if (strtolower($f['Value']) != 'cp1251')
Error('База данных работает в кодировке, отличной от cp1251 (значение: '.$f['Value'].')');
У меня сайт на хостинге, в phpMyAdmin я переключил всё, что можно на cp1251 - это не помогло.
команды SET character_set_results = 'cp1251' и SET NAMES cp1251, так же не помогли.
Пришлось закомментировать проверку в скрипте.
при запуске сразу горорит:
База данных работает в кодировке, отличной от cp1251 (значение: utf8).
Ответить Ссылка 0Мне нравится
Вуколов Роман 08.01.2011 04:09:22
такая же фигня
Ответить Родитель Ссылка 0Мне нравится
Базаров Михаил 20.03.2013 23:34:19
В 32 ой строчке конвертера замените на
if (strtolower($f['Value']) != 'utf8')
помогло.
Ну или вообще эту проверку убить можно. Еще вариант запустить базу в 1251
В файле мария ДБ
дописал
и заработало
В принципе вот здесь в конце есть как можно получить список запросы на конвертацию таблиц
MySQL Query Error!
Всё понятно до пункта 9 Общий порядок действий:
Перекодируйте все файлы сайта в UTF-8.
И КАК ИМЕННО это сделать? Вопрос к сотрудникам Битрикса. Задать вопрос в комментариях не получается - ошибка.
Обновите модуль производительности, после этого в списке мастеров административного раздела (Рабочий стол - Настройки - Настройки продукта - Список мастеров) запустите мастер "Конвертация в utf8". Об этом сказано во втором абзаце урока, на который вы приводите ссылку:
Перекодируйте все файлы сайта в UTF-8.