'; $STEP = intval($_REQUEST['step']); if (!$STEP) $STEP = 1; $strRes = ''; define('LIMIT', 10); // time limit if (!$_REQUEST['go']) { // Обязательные проверки if (!function_exists('mb_convert_encoding')) Error('Не доступна библиотека mbstring'); if (ini_get('mbstring.func_overload') != 2) Error('Значение параметра mbstring.func_overload не равно 2'); if (!defined('BX_UTF') || BX_UTF !== true) Error('Константа BX_UTF не определена в true в /bitrix/php_interface/dbconn.php:

define("BX_UTF", true);'); $res = $DB->Query('SHOW VARIABLES LIKE "character_set_results"'); $f = $res->Fetch(); if (strtolower($f['Value']) != 'cp1251') Error('База данных работает в кодировке, отличной от cp1251 (значение: '.$f['Value'].')'); } else // GO! { define('START_TIME', time()); // засекаем время старта if ($STEP < 3) { define('START_PATH', $_SERVER['DOCUMENT_ROOT']); // стартовая папка для поиска if ($_REQUEST['break_point']) define('SKIP_PATH',$_REQUEST['break_point']); // промежуточный путь Search(START_PATH); if (defined('BREAK_POINT')) { ?>
Идёт обработка...
Текущий файл: Шаг $STEP выполнен успешно"; $STEP++; } } elseif ($STEP == 3) // Конвертация базы { if ($_REQUEST['break_point']) define('SKIP_PATH',$_REQUEST['break_point']); // промежуточный путь $res = $DB->Query('SHOW TABLES'); while($f = $res->Fetch()) { $table = $f['Tables_in_'.$DBName]; if (defined('SKIP_PATH') && !defined('FOUND')) { if ($table == SKIP_PATH) define('FOUND', true); else continue; } $DB->Query('ALTER TABLE `'.$table.'` CHARACTER SET utf8 COLLATE utf8_unicode_ci'); $res0 = $DB->Query('SHOW FULL COLUMNS FROM `'.$table.'`'); while($f0 = $res0->Fetch()) { if (false!==strpos($f0['Type'],'char') || false!==strpos($f0['Type'],'text')) { $Collation = strpos($f0['Collation'], '_bin') ? 'utf8_bin' : 'utf8_unicode_ci'; $q = 'ALTER TABLE `'.$table.'` MODIFY `'.$f0['Field'].'` '.$f0['Type'].' CHARACTER SET utf8 COLLATE '.$Collation.($f0['Null']!='YES'?' NOT ':'').' NULL '.($f0['Default'] === NULL ? ($f0['Null'] == 'YES' ? 'DEFAULT NULL' : '') : 'DEFAULT "'.$DB->ForSql($f0['Default']).'"'); $DB->Query($q); if (time() - START_TIME > LIMIT) { if (!defined('BREAK_POINT')) define('BREAK_POINT', $table); break; } } } if (defined('BREAK_POINT')) break; } if (defined('BREAK_POINT')) { ?>
Идёт обработка...
Текущая таблица: Query('ALTER DATABASE `'.$DBName.'` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci'); die(" Шаг $STEP выполнен успешно.
Конвертация завершена.

Последние штрихи:
  • Установите в /bitrix/php_interface/after_connect.php:
    \$DB->Query("SET NAMES 'utf8'");
    \$DB->Query('SET collation_connection = "utf8_unicode_ci"');
  • Измените кодировку языка и сайтов на utf-8, если еще не сделано
  • Удалите весь кеш в административной панели
    Обязательно удалите ".__FILE__."!
    "); } } } $arStep = array( 0, 'Проверка прав доступа', 'Конвертация файлов в UTF8', 'Конвертация базы данных в UTF8' ) ?>

    Конвертация сайта в utf8

    Пример скрипта, описанного в блоге: http://dev.1c-bitrix.ru/community/blogs/howto/1466.php

    Шаг

    ' : '' )?>
    LIMIT) { if (!defined('BREAK_POINT')) define('BREAK_POINT', $path); return; } if (defined('SKIP_PATH') && !defined('FOUND')) // проверим, годится ли текущий путь { if (0!==strpos(SKIP_PATH, dirname($path))) // отбрасываем имя или идём ниже return; if (SKIP_PATH==$path) // путь найден, продолжаем искать текст define('FOUND',true); } if (is_dir($path)) // dir { $dir = opendir($path); while($item = readdir($dir)) { if ($item == '.' || $item == '..') continue; Search($path.'/'.$item); } closedir($dir); } else // file { if (!defined('SKIP_PATH') || defined('FOUND')) { if ((substr($path,-3) == '.js' || substr($path,-4) == '.php' || basename($path) == 'trigram') && $path != __FILE__) Process($path); } } } function Process($file) { global $STEP; if ($STEP == 1) { if (!is_writable($file)) Error('Файл не доступен на запись: '.$file); } elseif ($STEP == 2) { $content = file_get_contents($file); if (GetStringCharset($content) != 'cp1251') return; if ($content === false) Error('Не удалось прочитать файл: '.$file); if (file_put_contents($file, mb_convert_encoding($content, 'utf8', 'cp1251')) === false) Error('Не удалось сохранить файл: '.$file); } } function GetStringCharset($str) { global $APPLICATION; if (preg_match("/[\xe0\xe1\xe3-\xff]/",$str)) return 'cp1251'; $str0 = $APPLICATION->ConvertCharset($str, 'utf8', 'cp1251'); if (preg_match("/[\xe0\xe1\xe3-\xff]/",$str0,$regs)) return 'utf8'; return 'ascii'; } function Error($text) { die(''.$text.''); } ?>