Итак, имеем исходные данные: локальная версия сайта на CMS БУС редакции «Эксперт»/8.0.6, работающая в среде Денвер-3: Apache/2.2.4 (Win32), mod_ssl/2.2.4, OpenSSL/0.9.8d, PHP/5.2.4, MySql/5.0.45. Кодировка БД — cp1251, текстовых файлов ANSI (windows-1251). Операционная система — WinXP SP3.
Формулировка задачи: перевести БД и текстовые (как минимум — языковые) файлы в кодировку UTF-8.
Решение задачи для БД похоже на ритуальные танцы с бубном:
1. Средствами БУС создаем резервную копию БД
2. Удаляем БД и вновь создаем её (пустую, без таблиц) с помощью phpMyAdmin, устанавливая опцию "сравнение" в utf8_general_ci
3. Загружаем архив БД и файл restore.php (из стандартной поставки БУСа) в корень сайта и запускаем restore.php на выполнение (http://<имя сайта>/restore.php)
4. После распаковки архива заходим в папку /bitrix/backup/ и находим там два файла: xxxxxxxxxxxx_yyyyyyyy.sql и xxxxxxxxxxxx_yyyyyyyy_after_connect.sql (где x — цифра, y — цифра или буква)
5. Файл xxxxxxxxxxxx_yyyyyyyy.sql достаточно большой и при работе с ним нужен особый подход. Можно использовать, например, phpDesigner или Notepad++ (к сожалению, любимый мною PHP Expert Editor не годится) или что-то еще, что мне неизвестно. Некоторые советуют даже IE. Но это — особого рода мазохизм. Я использовал Notepad++. Открываем в нем файл xxxxxxxxxxxx_yyyyyyyy.sql, в меню "Кодировки" устанавливаем "Преобразовать в UTF-8 без BOM" (BOM - Byte Order Mark), заменяем строки CHARSET=cp1251 на CHARSET=utf8 и windows-1251 на UTF-8. Сохраняем файл.
6. Файл xxxxxxxxxxxx_yyyyyyyy_after_connect.sql маленький, открываем его в блокноте и заменяем в нем SET NAMES 'cp1251' на SET NAMES 'utf8'
7. В файл /bitrix/php_interface/dbconn.php добавляем строку
define("BX_UTF",true); |
8. В файл /bitrix/php_interface/after_connect.php добавляем строку
$DB->Query("SET NAMES 'utf8'"); |
$DB->Query("SET NAMES cp1251"); |
9. Завершаем процесс восстановления БД (галочку создания БД не ставим!) и радуемся полученному результату — БД находится в кодировке utf8 с корректным отображением всех символов и букв и готова к работе со всякими умляутами...
Следующий шаг — перекодировка файлов. Скипт перекодировки файлов можно написать самому (он рекурсивен и тривиален одновременно ) или скачать готовый (изменив его таким образом, чтобы перекодировались только текстовые файлы, иначе...).
Затем необходимо в корневой файл .htaccess добавить строки (только, если PHP младше 5.2.8, иначе придётся данные параметры устанавливать в php.ini):
php_value mbstring.func_overload 2 php_value mbstring.internal_encoding UTF-8 |
Всё! Радуемся жизни — она на данный момент вроде как удалась!
P.S.
Разумеется, в юникоде множество подводных камней (ведомых разве что специалистам), в том числе в части, касающейся работы с кириллическими строками. Поэтому несмотря на все танцы радость может немного омрачиться. Во всяком случае я, пока вместо
$char = $string[$i]; |
$char = substr($string,$i,1); |
P.P.S.
Процесс перекодировки БД можно существенно упростить, используя уже готовый скрипт, адаптировав его к БУС.