Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][PHP]wczytywanie wiadomości RSS + kodowanie PL
Forum PHP.pl > Forum > Przedszkole
ravvir
Witam,

od wczoraj walczę z podstroną mojej strony gdzie
wczytuję wiadomości z innej strony za pomocą RSS
przy czym problem tkwi w rozbieżności kodowania
Moja strona jest w UTF8 a źródło w iso 8859-2

pokazuje mi czystą stronę
na chwile obecna mam coś takiego :

Kod:

plik feed.php
  1. <?php
  2. function plCharset($string, $type = ISO88592_TO_UTF8) {
  3.  
  4. $win2utf = array(
  5. "\xb9" => "\xc4\x85", "\xa5" => "\xc4\x84",
  6. "\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86",
  7. "\xea" => "\xc4\x99", "\xca" => "\xc4\x98",
  8. "\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81",
  9. "\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93",
  10. "\x9c" => "\xc5\x9b", "\x8c" => "\xc5\x9a",
  11. "\xbf" => "\xc5\xbc", "\x8f" => "\xc5\xbb",
  12. "\x9f" => "\xc5\xba", "\xaf" => "\xc5\xb9",
  13. "\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83"
  14. );
  15. $iso2utf = array(
  16. "\xb1" => "\xc4\x85", "\xa1" => "\xc4\x84",
  17. "\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86",
  18. "\xea" => "\xc4\x99", "\xca" => "\xc4\x98",
  19. "\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81",
  20. "\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93",
  21. "\xb6" => "\xc5\x9b", "\xa6" => "\xc5\x9a",
  22. "\xbc" => "\xc5\xba", "\xac" => "\xc5\xb9",
  23. "\xbf" => "\xc5\xbc", "\xaf" => "\xc5\xbb",
  24. "\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83"
  25. );
  26.  
  27. if ($type == ISO88592_TO_UTF8)
  28. return strtr($string, $iso2utf);
  29. if ($type == UTF8_TO_ISO88592)
  30. return strtr($string, array_flip($iso2utf));
  31. if ($type == WIN1250_TO_UTF8)
  32. return strtr($string, $win2utf);
  33. if ($type == UTF8_TO_WIN1250)
  34. return strtr($string, array_flip($win2utf));
  35. if ($type == ISO88592_TO_WIN1250)
  36. return strtr($string, "\xa1\xa6\xac\xb1\xb6\xbc",
  37. "\xa5\x8c\x8f\xb9\x9c\x9f");
  38. if ($type == WIN1250_TO_ISO88592)
  39. return strtr($string, "\xa5\x8c\x8f\xb9\x9c\x9f",
  40. "\xa1\xa6\xac\xb1\xb6\xbc");
  41. }
  42.  
  43.  
  44. function pokazRSS($adres, $ilosc=5)
  45. {
  46. $xmldata='';
  47. $plik = fopen($adres, "r");
  48. while (!feof($plik)) $xmldata.=fgets($plik,1024);
  49. fclose($plik);
  50.  
  51. $xmlparser=xml_parser_create();
  52. xml_parse_into_struct($xmlparser,$xmldata,$values,$indexes);
  53. xml_parser_free($xmlparser);
  54.  
  55. $tytul='';
  56. $opis='';
  57. $link='';
  58. $wynik='';
  59.  
  60. $i=0;
  61. while (isset($values[$i]['tag']) && $values[$i]['tag']!='ITEM')
  62. {
  63. if ($values[$i]['tag']=='TITLE') $tytul=$values[$i]['value'];
  64. if ($values[$i]['tag']=='DESCRIPTION') $opis=$values[$i]['value'];
  65. if ($values[$i]['tag']=='LINK') $link=$values[$i]['value'];
  66. $i++;
  67. }
  68. $i++;
  69.  
  70. //$wynik.='RSS: <a href="'.$link.'">'.$tytul.'</a><br />';
  71.  
  72. while ($i<count($values) && $ilosc>0)
  73. {
  74. $wiad_tytul='';
  75. $wiad_opis='';
  76. $wiad_link='';
  77. $wiad_pubd='';
  78.  
  79. while (isset($values[$i]['tag']) && !($values[$i]['tag']=='ITEM' && $values[$i]['type']=='open'))
  80. {
  81. if (isset($values[$i]['value']))
  82. {
  83. if ($values[$i]['tag']=='TITLE') $wiad_tytul=$values[$i]['value'];
  84. if ($values[$i]['tag']=='DESCRIPTION') $wiad_opis=$values[$i]['value'];
  85. if ($values[$i]['tag']=='LINK') $wiad_link=$values[$i]['value'];
  86. if ($values[$i]['tag']=='PUBDATE') $wiad_pubd=$values[$i]['value'];
  87. }
  88. $i++;
  89. }
  90. if ($wiad_pubd!='') $wiad_pubd='('.date('d.m.Y',strtotime($wiad_pubd)).')';
  91. $wynik.='<div><b>'.$wiad_tytul.' '.$wiad_pubd.'</b><br />'.$wiad_opis.' <a href="'.$wiad_link.'">Wiecej</a><hr size="1"></div>';
  92.  
  93. $i++;
  94. $ilosc--;
  95. }
  96. return plCharset($wynik,ISO88592_TO_UTF8);
  97. }
  98. ?>
  99.  


oraz plik wykonawczy rss.php
  1. <?php
  2. include_once "page/rss/news/feed.php";
  3. pokazRSS('http://moto.pl/pub/rss/motopl_hp.xml',5);
  4. ?>


Prosiłbym o pomoc jeżeli macie idee na to aby:
1/ wyświetlało newsy
2/ była możliwość automatycznego wczytywania newsów z jednego kanału i opcja wyboru z listy innych kanałów rss do wczytania
3/ by po wciśnięciu "więcej" wyświetlało cały tekst a nie odsyłało do źródła
4/ wyświetlało grafikę ze źródła

Przetrzepałem sporo stron i nigdzie nie znalazłem dobrego rozwiązania.
Myślę że ten wątek pomoże wielu osobom.
thek
A może zamiast tak się bawić z kodowaniem nie warto byłoby użyć iconv? To samo z file_get_contents zamiast fopen
ad1) Wyświetlanie newsów to chyba tylko przeparsowanie samego XML, czyli czytajRSS() bez błędów
ad2) Select z adresami jako value i onchange+AJAX lub przeładowanie strony z POST?
ad3) Zmiana w linku Więcej? By zamiast href docelowego był własny skrypt pobierający tę stronę?
ad4) Jeśli ktoś walnął blokade na hotlinka to i tak możesz sobie poskakać a nic nie wymyślisz. Poza tym gdzie te obrazki... Na stronie docelowej? W samym kodzie RSS jako znacznik image??
AlexDeLarge
A lodzika nie szczelić?

mb_convert_encoding - tym się konwertuje kodowanie. Co to znaczy "nie wyświetla"? Zrobiłeś jakieś debugowanie? Choćby wyświetlanie w różnych miejscach funkcji pokazRSS() aktualnych wartości zmiennych za pomocą var_dump() ?

Zdrówka życzę.

O, thek mnie ubiegł. Również życzę zdrówka.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.