Битрикс: конвертация поля HTML/TEXT из cp1251 в UTF - 8




При попытке конвертации сайт из кодировки CP1251 в UTF-8 часто возникает проблема в том, что ломается поле инфоблока HTML/TEXT. Битрикс хранит поле в формате json.
Для восстановления данных необходимо перекодировать json в многобайтовую кодировку, т.е. пересчитать кол-во байт информации.

a:2:{s:4:"TEXT";s:24:"< h1 >HTML-ТЕКСТ< /h1 >";s:4:"TYPE";s:4:"html";} 
после буквы "s" - указано кол-во байт информации

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

global $DB;
/*
* PROPERTY_180 - название свойства
* b_iblock_element_prop_s52 - таблица
* */


$rs = $DB->Query('SELECT IBLOCK_ELEMENT_ID, PROPERTY_180 from b_iblock_element_prop_s52;');
while($row = $rs->Fetch())
{
$str = unserialize($row['PROPERTY_180']);
if($str == false){/*ЕСЛИ JSON не удалось декодировать*/

/*ПРОБУЕМ СМЕНИТЬ КОДИРОВКУ*/
$encodingIn = mb_detect_encoding($row['PROPERTY_180'],'auto');
$row['PROPERTY_180'] = iconv($encodingIn,'WINDOWS-1251',$row['PROPERTY_180']);

/*ДЕКОДИРУЕМ JSON*/
$str = unserialize($row['PROPERTY_180']);
if($str){
$str['TEXT'] = str_replace(array("'"),'',$str['TEXT']);
$arUpdate = array(
'TYPE' => $str['TYPE'],
'TEXT' => iconv('WINDOWS-1251','UTF-8',$str['TEXT']),
);

/*КОДИРУЕМ В JSON В НОВОЙ КОДИРОВКЕ*/
echo $row['IBLOCK_ELEMENT_ID']."<br>";
echo $newJson = serialize($arUpdate);
$elID = $row['IBLOCK_ELEMENT_ID'];
if($newJson && $elID){
$rs2 = $DB->Query("UPDATE b_iblock_element_prop_s52 SET PROPERTY_180 = '$newJson' WHERE IBLOCK_ELEMENT_ID = $elID LIMIT 1;");
if($rs2){
echo '-updated';
}else{
echo '-error-update';
}
}

echo '<br><br>';
}
}
}


Возврат к списку


Адрес

г.Москва
ул. Лесная 7

График работы
  • 9:00-21:00
  • без выходных
Телефон
  • +7 (968) 929-40-41
E-mail

info@megabit24.ru