ГлавнаяКарта сайтаНапишите намПоиск по сайту
EDS-Soft
ElectroDynamic Systems Software ScientificTM
Antenna Systems ResearchTM
Radiolocation Systems ResearchTM



Antenna Array


Когерентность

Состояние двух или нескольких колебаний, при котором сохраняется постоянное соотношение фаз между этими колебаниями.

(из «Словаря терминов» нашего сайта)






Перекодировка сайта из windows-1251 в UTF-8 в CMS «Битрикс: Управление сайтом»





Преамбула. В связи с планирующимся добавлением на сайт контента на немецком языке, встала задача перевода сайта из кодировки windows-1251 в кодировку UTF-8. Для неспециалиста в области PHP и MySQL (меня, то есть) задача не совсем очевидная. :( Но поскольку бюджетом расходы на специалиста не всегда предусмотрены, вынужденно с задачей можно справиться и своими силами. Тем более, что это не интегро-дифференциальные уравнения из области разных дифракций решать. На пару-тройку порядков полегче будет. :D Полтора дня поиска в интернете и пара сообщений в службу техподдержки компании «Битрикс» — и решение получено. При этом львиная доля времени ушла на преодоление известной проблемы с кодировками кириллических букв "ш" и "И".

Итак, имеем исходные данные: локальная версия сайта на 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. Но это — особого рода мазохизм. :D Я использовал 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);
до конца счастлив не был. 8) Так штаааа... Усилено ждём PHP 6, где будет правильная работа с юникодом? Или не будет?

P.P.S.
Процесс перекодировки БД можно существенно упростить, используя уже готовый скрипт, адаптировав его к БУС.

Для добавления комментария необходимо зарегистрироваться на сайте

 




 
 
EDS-Soft

© 2002-2020 | EDS-Soft
Контакты | Правовая информация | Поиск | Карта сайта

© дизайн сайта | Андрей Азаров