Сразу оговорюсь, что данный пост не претендует на статус официального документа, это должно быть хорошее подспорье по проблеме.
[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
Если вы использовали интеграцию с почтой, проверьте настройки ящиков, если там установлена кодировка, переключите кодировку сайта.
Магазин -> Настройки магазина -> Платёжные системы, выбираем на редактирование какую-нибудь, и в выпадающем списке поля "Обработчик" видим казяблики(
Не подскажете где поправить можно?
Вам надо переустановить демо версию в нужной кодировке.
Если требуется для одного из сайтов utf-8 - надо все сайты сконвертировать в utf-8.
Понятно зачем если сайт многоязычный (один сайт Битрикс может содержать тексты на двух и более языках).
Да и экзотика это. Едва ли есть такое на практике (все равно надо определяться с языковой версией компонент, она может быть только одна).
А в других случаях зачем?
Только Chrome автоматически не определял кодировку, только при указании UTF-8 вручную, сайт отображался правильно. Победил путем добавления в header.php шаблона строки header('Content-Type: text/html; charset=utf-8');
Проблема вылезла позже, в процессе работы.
Решили прикрутить форму авторизации в всплывающем окне.
Кастомизировал компонент system.auth.form после переноса в папку шаблона.
Всплывающее окно вызывается через fancybox
В итоге вижу битую кодировку в попап-форме авторизации. Страница, с которой вызывается попап-форма отображается корректно, а в самой форме кодировка битая. Причем этот глюк виден в Chrome. Проверял в Opera, Firefox - без проблем.
Пока что решения не нашел. Может где-то затаился файл с вин1251-кодировкой. Языковые файлы компонента формы авторизации в utf-8, проверял
Fatal error: Unsupported operand types in /home/taukensa/public_html/bitrix/modules/main/classes/general/cache.php on line 822
Подскажите что делать?
mysql_query("SET NAMES 'cp1251'");mysql_query("SET CHARACTER SET 'cp1251'");На Windows-платформе обнаружил проблему: конвертация файлов не идёт дальше первого "захода" (автоматической перезагрузки формы) и рапортует об успехе, когда в реальности сконвертированы не все файлы.
Проблема оказалась в функции dirname, в Windows она использует оба слеша:
dirname('c:/x'); // возвращает 'c:\'function winDirname($path) { return str_replace('\\', '/', dirname($path)); }Только я бы местами поменял пункты, а то когда кракозябры в админке, тяжко что-то перенастраивать:
``Добавить в /bitrix/php_interface/dbconn.php define("BX_UTF", true);``
и пункты
``Изменить в настройках сайта кодировку с windows-1251 на utf-8``
``Изменить в настройках языка ru кодировку с windows-1251 на utf-8``
Жду уже 1час досихпор конвертируется таблица b_stat_guest.
Конвертацию провожу на хостинге timeweb.ru.
Идёт обработка...
Текущая таблица: b_stat_guest
Для демо версии этот вариант не подходит.
Вам надо переустановить демо версию в нужной кодировке.
Сделали 3 первых шага подготовки к конвертации:
Подготовить сервер как показано выше
— Добавить в /bitrix/php_interface/dbconn.php define("BX_UTF", true); — добавили
— Изменить в настройках сайта кодировку с windows-1251 на utf-8 — изменили
— Изменить в настройках языка ru кодировку с windows-1251 на utf-8 — изменили
Далее пишет, BX_UTF не задан.
В чем дело??
теперь надо указывать еще в 2х файлах
after_connect_d7.php
<? $connection = \Bitrix\Main\Application::getConnection(); $connection->queryExecute("SET NAMES 'utf8'"); $connection->queryExecute('SET collation_connection = "utf8_unicode_ci"'); ?>при переносе накидал скрипт на коленке
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); if($USER->IsAdmin()) { global $DB; $r = $DB->Query("SEL ECT ID FR OM b_iblock_property WHERE PROPERTY_TYPE='S'"); while($prop = $r->Fetch()) { $rV = $DB->Query("SELECT ID,VALUE FR OM b_iblock_element_property WHERE IBLOCK_PROPERTY_ID=".$prop['ID']." AND VALUE IS NOT NULL AND VALUE LIKE 'a:%'"); while($pV = $rV->Fetch()) { $s_cp1251 = iconv('utf-8','windows-1251',$pV['VALUE']); $u_cp1251 = unserialize($s_cp1251); array_walk_recursive($u_cp1251,'c'); $s_utf8 = serialize($u_cp1251); $updateSql = "UPD ATE b_iblock_element_property SE T VALUE='".$DB->ForSql($s_utf8)."' WH ERE ID=".$pV['ID']; $DB->Query($updateSql); } } } function c(&$item, &$key) { global $APPLICATION; $item = $APPLICATION->ConvertCharset($item,'windows-1251','UTF-8'); } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>При попытке выгрузить каталог из 1С в Битрикс сервер отвечает битой кодировкой (не могу прочитать ошибку).
Но если загрузить файлы выданные 1С через импорт вручную, то все проходит нормально. В чем может быть проблема?
Значения mbstring изменил encoding На UTF-8 и overload На 2.
1. Сделать резервную копию сайта без сохранения поискового индекса и таблиц статистики.
2. Задать и активизировать значения PHP-параметров:
3. Удалить модуль «Поиск» без сохранения данных.
4. Если был установлен, удалить модуль «Веб-аналитика» без сохранения данных (типы и шаблоны сообщений не удалять).
5. Удалить из «Словаря транслита» (модуль «Форумы») запись 7:
7. Изменить в региональных настройках кодировку с windows-1251 на utf-8 (в настройках сайта должна быть выбрана соответствующая региональная настройка, как правило ru).
8. Добавить в /bitrix/php_interface/dbconn.php по sftp:
define("BX_UTF", true);9. Запустить скрипт . Дождаться успешного выполнения.
10. Установить в /bitrix/php_interface/after_connect.php по sftp:
$DB->Query("SET NAMES 'utf8'"); $DB->Query('SET collation_connection = "utf8_unicode_ci"');11. Установить в /bitrix/php_interface/after_connect_d7.php по sftp:
$connection->queryExecute("SET NAMES 'utf8'"); $connection->queryExecute('SET collation_connection = "utf8_unicode_ci"');12. Установить в /bitrix/.settings.php по sftp:
13. Очистить все файлы кеша сайта.
14. Разавторизоваться. Авторизоваться.
15. Удалить из корневой директории сайта скрипт convert_utf8.php.
16. Установить модуль «Поиск». Переиндексировать сайт.
17. Если необходимо, установить модуль «Веб-аналитика».
Не могу найти не где в директориях сайта:
"12. Установить в /bitrix/.settings.php по sftp:"
Как будто такого файла нет...
Подскажите пожалуйста, где и как его найти?
Заранее спасибо за ответ!
И также если не сложно по этому пункту объясните пожалуйста:
"2. Задать и активизировать значения PHP-параметров: "
2. Масса информации. Например, тут:
Я лично правил в конфигах Apache для соответствующего виртуального хоста.
Я все перерыл, но нет у меня не где файла .settings.php... Я вручную создал этот файл и положил его в директорию.
Скажите имеет ли значение, где прописывать параметры:
mbstring.func_overload 2
mbstring.internal_encoding UTF-8
Я прописал их в файле .htaccess расположенного в корне сайта и скрипт перестал на них ругаться.
После всех действий из вашей инструкции запустил скрипт convert_utf8.php, он выполнился без ошибок база перешла в utf-8. Но сайт так и остался в квадратах, не сбор кэшей, не разлогин, не помогают. Все проделывал уже в 5 раз и не как ;(
Подскажите пожалуйста, в чем моя проблема?
Заранее спасибо за ответ!