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

Тема в разделе "Как сделать...", создана пользователем Бобр Добр, 10 мар 2010.

Статус темы:
Закрыта.
  1. Бобр Добр

    Бобр Добр

    Регистр.:
    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:
    Также нельзя поднимать щенка под локотки. Связки у него еще слабые, и  можно так растянуть их, что собака приобретет дефект В«локти в полеВ»  (свободные локти). Особенно это касается щенков такс. По этой же причине  щенка водят только на ошейнике, полностью исключив из В«амуницииВ»  малыша шлейку. Щенка поднимают, подхватывая его обеими руками и плотно  удерживая — [...]
    какие то непонятные букв "Б, Ђ, В" в тексте появляются
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    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.
     
    Бобр Добр нравится это.
  3. Бобр Добр

    Бобр Добр

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

    Ins1ne Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    89
    Симпатии:
    25
    может быть надо
    PHP:
    echo  iconv("utf-8""Windows-1251""$item->description");  
     
    Бобр Добр нравится это.
Статус темы:
Закрыта.