ďťż
Podstrony
|
telcocafeWitam,Korzystam ze skryptu czytnika RSS zamieszczonego w jednym z nr KŚ Ekspert. Mam problem - chcąc wyświetlać informacje z np. kanału http://lottomaniak.net/rss/lotto.xml nie mam polskich liter na swojej stronie (moje kodowanie ISO-8859-2), ale np. na stronie http://infoo.pl/rss/...?rid=296&order= polskie litery są poprawnie wyświetlane. Czy to zależy od skryptu czytnika kanału czy można to w inny sposób rozwiązać ? Z góry dzięki za pomoc... Nie zgadzają się kodowania... RSS ma UTF8 (polecam to kodowanie do stosowania i na stronce). Sposobów na konwersję jest kilka: - użycie iconv lub mbstring jeśli są dostępne w PHP - użycie prostego skryptu (funkcji) takiego jak ten: function plCharset($string, $type = ISO88592_TO_UTF8) { $win2utf = array( "\xb9" => "\xc4\x85", "\xa5" => "\xc4\x84", "\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86", "\xea" => "\xc4\x99", "\xca" => "\xc4\x98", "\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81", "\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93", "\x9c" => "\xc5\x9b", "\x8c" => "\xc5\x9a", "\xbf" => "\xc5\xbc", "\x8f" => "\xc5\xbb", "\x9f" => "\xc5\xba", "\xaf" => "\xc5\xb9", "\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83" ); $iso2utf = array( "\xb1" => "\xc4\x85", "\xa1" => "\xc4\x84", "\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86", "\xea" => "\xc4\x99", "\xca" => "\xc4\x98", "\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81", "\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93", "\xb6" => "\xc5\x9b", "\xa6" => "\xc5\x9a", "\xbc" => "\xc5\xba", "\xac" => "\xc5\xb9", "\xbf" => "\xc5\xbc", "\xaf" => "\xc5\xbb", "\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83" ); if ($type == ISO88592_TO_UTF8) return strtr($string, $iso2utf); if ($type == UTF8_TO_ISO88592) return strtr($string, array_flip($iso2utf)); if ($type == WIN1250_TO_UTF8) return strtr($string, $win2utf); if ($type == UTF8_TO_WIN1250) return strtr($string, array_flip($win2utf)); if ($type == ISO88592_TO_WIN1250) return strtr($string, "\xa1\xa6\xac\xb1\xb6\xbc", "\xa5\x8c\x8f\xb9\x9c\x9f"); if ($type == WIN1250_TO_ISO88592) return strtr($string, "\xa5\x8c\x8f\xb9\x9c\x9f", "\xa1\xa6\xac\xb1\xb6\xbc"); } NIC, ale po co tak? Przecież wystarczy wysłać odpowiedni nagłówek: header('charset=utf-8'); Ale to zmienia tylko nagłówek, a litery masz dalej w starym kodowaniu. No jak na moje, to jak napisałeś wysyła odpowiedni nagłówek dzięki któremu przeglądarka powinna ustawić kodowanie (utf-8), czyli takie, jakie być powinno. Tak też będzie. Ale wtedy reszta strony będzie z krzaczkami, gdyż treść z RSSa jest w UTF8, a reszta treści na stronie w ISO. Bo wątpię by na swojej stronie (moje kodowanie ISO-8859-2 oznaczało, że Jego strona jest pozbawiona treści w tym kodowaniu. Poza tym co to znaczy ustawić w nagłówku UTF8 dla stronki w ISO? Będą krzaczki. Nie bez powodu w końcu powstała ta funkcja wklejona przeze mnie... Gdyby to było takie proste jak mówisz to by nie istniała takowa. Ale rss to nie fragment strony o oddzielny dokument (tak przedstawiony) XML. A co do kodowania - tak, ma iso, ale to może być powód, by te iso zmienić na utf, prawda? Chodziło mi o to, aby dane z rss-a przedstawić jako utf-8, a nie jako iso i do tego wysłać odpowiedni nagłówek. Ale tutaj RSS jest użyty jako kawałek strony (krótko mówiąc include lub readfile jak kto woli) i kodowania muszę być w zgodzie. Na UTF8 to już pisałem, że polecam. ...Będą krzaczki. Nie bez powodu w końcu powstała ta funkcja wklejona przeze mnie... Gdyby to było takie proste jak mówisz to by nie istniała takowa. Właśnie o te "krzaczki" mi się rozchodzi. Mam tą swoją stronkę i np. na stronie głównej pobieram dane z http://rss.gazeta.pl.../wiadomosci.xml - wszystko jest ok, polskie znaki, a teraz jest podstrona np. Praca gdzie pobieram dane z http://www.pracuj.pl...amp;name=Polska i np. wpis wygląda następująco: Przewo?nik Drogowy Szko?a Przewo?ników Drogowych Equus W związku z tym czy tą prezentowaną funkcję wyżej należy jakoś odpowiednio jeszcze skonfigurować ? Proszę o jeszcze jakieś wskazówki. Jeśli zmienię kodowanie na "utf-8" to krzaczki pokazują się na pierwszej stronie... plCharset($tresc,UTF8_TO_ISO88592) Musisz zmodyfikować ten skrypt co wyświetla te dane z RSSa. Niestety nie powiem gdzie, bo skryptu nie posiadam. Ale mniej więcej wystarczy "dopisać" w odpowiednich miejscach powyższą funkcyjkę (i dokleić jej kod gdzieś tam jeszcze). plCharset($tresc,UTF8_TO_ISO88592) Musisz zmodyfikować ten skrypt co wyświetla te dane z RSSa. Niestety nie powiem gdzie, bo skryptu nie posiadam. Ale mniej więcej wystarczy "dopisać" w odpowiednich miejscach powyższą funkcyjkę (i dokleić jej kod gdzieś tam jeszcze). Skrypt wygląda następująco: <?php function pokazRSS($adres, $ilosc=5) { $xmldata=''; $plik = fopen($adres, "r"); while (!feof($plik)) $xmldata.=fgets($plik,1024); fclose($plik); $xmlparser=xml_parser_create(); xml_parse_into_struct($xmlparser,$xmldata,$values,$indexes); xml_parser_free($xmlparser); $tytul=''; $opis=''; $link=''; $wynik=''; $i=0; while (isset($values[$i]['tag']) && $values[$i]['tag']!='ITEM') { if ($values[$i]['tag']=='TITLE') $tytul=$values[$i]['value']; if ($values[$i]['tag']=='DESCRIPTION') $opis=$values[$i]['value']; if ($values[$i]['tag']=='LINK') $link=$values[$i]['value']; $i++; } $i++; //$wynik.='RSS: <a href="'.$link.'">'.$tytul.'</a><br />'; while ($i<count($values) && $ilosc>0) { $wiad_tytul=''; $wiad_opis=''; $wiad_link=''; $wiad_pubd=''; while (isset($values[$i]['tag']) && !($values[$i]['tag']=='ITEM' && $values[$i]['type']=='open')) { if (isset($values[$i]['value'])) { if ($values[$i]['tag']=='TITLE') $wiad_tytul=$values[$i]['value']; if ($values[$i]['tag']=='DESCRIPTION') $wiad_opis=$values[$i]['value']; if ($values[$i]['tag']=='LINK') $wiad_link=$values[$i]['value']; if ($values[$i]['tag']=='PUBDATE') $wiad_pubd=$values[$i]['value']; } $i++; } if ($wiad_pubd!='') $wiad_pubd='('.date('d.m.Y',strtotime($wiad_pubd)).')'; $wynik.='<div><b>'.$wiad_tytul.' '.$wiad_pubd.'</b><br />'.$wiad_opis.' <a href="'.$wiad_link.'">Wiecej</a><hr size="1"></div>'; $i++; $ilosc--; } return ($wynik); } ?> oraz pokazRSS('http://www.pracuj.pl/ofertypracy/rss.aspx?regionID=0&name=Polska',5) ; Do skryptu wrzucam tą powyższą funkcję i (nie wiem czy to akurat dobrze robię) zamieniam linijki skryptu: $wynik.='<div><b>'.$wiad_tytul.' '.$wiad_pubd.'</b><br />'.$wiad_opis.' <a href="'.$wiad_link.'">Wiecej</a><hr size="1"></div>'; na $wynik.='<div><b>'.$wiad_tytul.' /*'.$wiad_pubd.'</b><br />'*/.plCharset($wiad_opis,UTF8_TO_ISO88592).' <a href="'.$wiad_link.'">Wiecej</a><hr size="1"></div>' Po tej zamianie nadal nie ma polskich liter. Użytkownik mefju edytował ten post 08 lipiec 2007, 12:38 Moja pierwsza myśl, że nie masz strony w ISO. Może UTF8_TO_WIN1250 Ci pomoże, ale mam nadzieję, że nie. Jak masz to na jakimś serwerku to po prostu zapokaż. Moja pierwsza myśl, że nie masz strony w ISO. Może UTF8_TO_WIN1250 Ci pomoże, ale mam nadzieję, że nie. Jak masz to na jakimś serwerku to po prostu zapokaż. Strony jako takiej nie ma, ale mogę pokazać mniej więcej co i jak ;) Adresik do stronki: www.naszeradio.icx.pl/php/rss/ - tu jest skrypt bez tej funkcji podanej powyżej, a tutaj z tą funkcją: www.naszeradio.icx.pl/php/rss/rss1/ i jeszcze paczki tych stronek w RARze - może coś pomogą RSS oraz RSS 1 W takiej konfiguracji u mnie działa: <?php function plCharset($string, $type = ISO88592_TO_UTF8) { $win2utf = array( "\xb9" => "\xc4\x85", "\xa5" => "\xc4\x84", "\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86", "\xea" => "\xc4\x99", "\xca" => "\xc4\x98", "\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81", "\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93", "\x9c" => "\xc5\x9b", "\x8c" => "\xc5\x9a", "\xbf" => "\xc5\xbc", "\x8f" => "\xc5\xbb", "\x9f" => "\xc5\xba", "\xaf" => "\xc5\xb9", "\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83" ); $iso2utf = array( "\xb1" => "\xc4\x85", "\xa1" => "\xc4\x84", "\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86", "\xea" => "\xc4\x99", "\xca" => "\xc4\x98", "\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81", "\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93", "\xb6" => "\xc5\x9b", "\xa6" => "\xc5\x9a", "\xbc" => "\xc5\xba", "\xac" => "\xc5\xb9", "\xbf" => "\xc5\xbc", "\xaf" => "\xc5\xbb", "\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83" ); if ($type == ISO88592_TO_UTF8) return strtr($string, $iso2utf); if ($type == UTF8_TO_ISO88592) return strtr($string, array_flip($iso2utf)); if ($type == WIN1250_TO_UTF8) return strtr($string, $win2utf); if ($type == UTF8_TO_WIN1250) return strtr($string, array_flip($win2utf)); if ($type == ISO88592_TO_WIN1250) return strtr($string, "\xa1\xa6\xac\xb1\xb6\xbc", "\xa5\x8c\x8f\xb9\x9c\x9f"); if ($type == WIN1250_TO_ISO88592) return strtr($string, "\xa5\x8c\x8f\xb9\x9c\x9f", "\xa1\xa6\xac\xb1\xb6\xbc"); } function pokazRSS($adres, $ilosc=5) { $xmldata=''; $plik = fopen($adres, "r"); while (!feof($plik)) $xmldata.=fgets($plik,1024); fclose($plik); $xmlparser=xml_parser_create(); xml_parse_into_struct($xmlparser,$xmldata,$values,$indexes); xml_parser_free($xmlparser); $tytul=''; $opis=''; $link=''; $wynik=''; $i=0; while (isset($values[$i]['tag']) && $values[$i]['tag']!='ITEM') { if ($values[$i]['tag']=='TITLE') $tytul=$values[$i]['value']; if ($values[$i]['tag']=='DESCRIPTION') $opis=$values[$i]['value']; if ($values[$i]['tag']=='LINK') $link=$values[$i]['value']; $i++; } $i++; //$wynik.='RSS: <a href="'.$link.'">'.$tytul.'</a><br />'; while ($i<count($values) && $ilosc>0) { $wiad_tytul=''; $wiad_opis=''; $wiad_link=''; $wiad_pubd=''; while (isset($values[$i]['tag']) && !($values[$i]['tag']=='ITEM' && $values[$i]['type']=='open')) { if (isset($values[$i]['value'])) { if ($values[$i]['tag']=='TITLE') $wiad_tytul=$values[$i]['value']; if ($values[$i]['tag']=='DESCRIPTION') $wiad_opis=$values[$i]['value']; if ($values[$i]['tag']=='LINK') $wiad_link=$values[$i]['value']; if ($values[$i]['tag']=='PUBDATE') $wiad_pubd=$values[$i]['value']; } $i++; } if ($wiad_pubd!='') $wiad_pubd='('.date('d.m.Y',strtotime($wiad_pubd)).')'; $wynik.='<div><b>'.$wiad_tytul.' '.$wiad_pubd.'</b><br />'.$wiad_opis.' <a href="'.$wiad_link.'">Wiecej</a><hr size="1"></div>'; $i++; $ilosc--; } return plCharset($wynik,UTF8_TO_ISO88592); } ?> |
|||
Sitedesign by AltusUmbrae. |