неправильная кодировка rss при парсинге

Статус
В этой теме нельзя размещать новые ответы.

Бобр Добр

Профессор
Регистрация
17 Янв 2010
Сообщения
242
Реакции
37
Привет всем! народ нужна помощь. Есть простейший rss парсер
PHP:
<?
function utf8_convert($str, $type)
{
   static $conv = '';
   if (!is_array($conv))
   {
      $conv = array();
      for ($x=128; $x <= 143; $x++)
      {
         $conv['utf'][] = chr(209) . chr($x);
         $conv['win'][] = chr($x + 112);
      }
      for ($x=144; $x<= 191; $x++)
      {
         $conv['utf'][] = chr(208) . chr($x);
         $conv['win'][] = chr($x + 48);
      }
      $conv['utf'][] = chr(208) . chr(129);
      $conv['win'][] = chr(168);
      $conv['utf'][] = chr(209) . chr(145);
      $conv['win'][] = chr(184);
   }
   if ($type == 'w')
   {
      return str_replace($conv['utf'], $conv['win'], $str);
   }
   elseif ($type == 'u')
   {
      return str_replace($conv['win'], $conv['utf'], $str);
   }
   else
   {
      return $str;
   }
}

echo '<h1><font color="red">Конфузы блогосферы</font></h1>';
$url = 'http://sobaks.pp.ua/feed/';       //адрес RSS ленты

$rss = simplexml_load_file($url);       //Интерпретирует XML-файл в объект

//цикл для обхода всей RSS ленты
foreach ($rss->channel->item as $item) {
 echo '<a href="'.$item->link.'">';
        echo '<h2>'.utf8_convert($item->title,"w").'</h2>';  //выводим на печать заголовок статьи 
 echo '</a>';
        echo utf8_convert($item->description,"w");   //выводим на печать текст статьи
}

?>
только вот изменение кадировки работает как мне кажется не корректно:
HTML:
Также нельзя поднимать щенка под локотки. Связки у него еще слабые, и  можно так растянуть их, что собака приобретет дефект В«локти в полеВ»  (свободные локти). Особенно это касается щенков такс. По этой же причине  щенка водят только на ошейнике, полностью исключив из В«амуницииВ»  малыша шлейку. Щенка поднимают, подхватывая его обеими руками и плотно  удерживая — [...]
какие то непонятные букв "Б, Ђ, В" в тексте появляются
 
php.net/iconv

PHP:
string iconv  ( string $in_charset  , string $out_charset  , string $str  );

Конвертит правильно и всегда.

Если нет iconv (я не представляю как такое может быть, но все же) - то попробуй это, вроде работает правильней чем твой:

PHP:
function Utf8ToWin($fcontents) {
    $out = $c1 = '';
    $byte2 = false;
    for ($c = 0;$c < strlen($fcontents);$c++) {
        $i = ord($fcontents[$c]);
        if ($i <= 127) {
            $out .= $fcontents[$c];
        }
        if ($byte2) {
            $new_c2 = ($c1 & 3) * 64 + ($i & 63);
            $new_c1 = ($c1 >> 2) & 5;
            $new_i = $new_c1 * 256 + $new_c2;
            if ($new_i == 1025) {
                $out_i = 168;
            } else {
                if ($new_i == 1105) {
                    $out_i = 184;
                } else {
                    $out_i = $new_i - 848;
                }
            }
            // UKRAINIAN fix
            switch ($out_i){
                case 262: $out_i=179;break;// і
                case 182: $out_i=178;break;// І
                case 260: $out_i=186;break;// є
                case 180: $out_i=170;break;// Є
                case 263: $out_i=191;break;// ї
                case 183: $out_i=175;break;// Ї
                case 321: $out_i=180;break;// ґ
                case 320: $out_i=165;break;// Ґ
            }
            $out .= chr($out_i);
           
            $byte2 = false;
        }
        if ( ( $i >> 5) == 6) {
            $c1 = $i;
            $byte2 = true;
        }
    }
    return $out;
}

Но правильно юзать iconv.
 
сразу скажу что второй вариант не работает.
плз помогите я просто не силён в php, что я сделал не правельно?
PHP:
echo  iconv("qtf-8", "Windows-1251", "$item->description");
 
сразу скажу что второй вариант не работает.
плз помогите я просто не силён в php, что я сделал не правельно?
PHP:
echo  iconv("qtf-8", "Windows-1251", "$item->description");

может быть надо
PHP:
echo  iconv("utf-8", "Windows-1251", "$item->description");
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху