ГлавнаяКарта сайтаНапишите намПоиск по сайту
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
Контакты | Правовая информация | Поиск | Карта сайта

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