Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czytnik kanału RSS - Problem ze zmianą kodowania
Forum PHP.pl > Forum > PHP
PiotrN
Witam.
Chciałem na stronie wyświetlać nagłówki ew. z zajawką z kanały RSS. Próbowałem już wielu kodów, ale nie działają. Przynajmniej w mojej sytuacji, gdy stronę mam kodowaną w iso-8859-2, a kanał jest w uft-8. Wreszcie znalazłem lastRSS i już by było wszystko ok - bo wszystko ładnie zmienia, ale wywala Notice: Undefined property: lastRSS::$rsscp in C:\wamp\www\rss2\lastRSS.php on line 106, więc patrze o co chodzi w wierszu 106 w pliku lastRSS.php i jedyne co wymyśliłem to usunięcie wiersza 105 i 106 czyli:
  1. //$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]);
  2. $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);

,ale bez tego na mojej stronie działa tylko kanał w kodowaniu iso-8859-2. Kanał utf-8 - krzaki.
Co mogę zrobić? Bardzo proszę Was o pomoc. Można powiedzieć że ten kod (kodowanie w iso-8859-2 i zamiana utf-8 na iso) to szczyt marzeń, którego od dawna nie mogę zdobyć. Proszę też nie piszcie że najlepiej zmienić kodowanie strony na utf-8 - bo to odpada.

W kodzie zmieniłem tylko kodowanie (na iso-8859-2). Kod ze strony: http://lastrss.oslab.net/index.php?q=doc/examples - "Multilingual Agregator".
Athlan
Mogę ewentualnie Ci pomóc, jeżeli masz odwagę (chęci) zaingerować w kod.

Jeżeli na serwerze masz dostępny Multibyte Strings (większość serwerów to ma), wówczas kodowanie możesz zrobić w sposób następujący:
  1. $sZawartoscZmiennej = mb_convert_encoding($sZawartoscZmiennej, 'kodowanie-wyjsciowe', 'kodowanie-wejsciowe');

Przy czym kodowanie wejściowe to parametr opcjonalny. Używasz go jeżeli jesteś pewien, że takie jest (jedno, w miarę stałe źródło informacji). Jeżeli nie, pomiń. W Twoim przypadku może to być:
  1. $out[1] = mb_convert_encoding($out[1], 'iso-8859-2', 'utf-8');


Przy okazji: zalecam Ci zmianę kodowania swojej strony na utf-8. Możesz wygoglować site:forum.php.pl, dlaczego.
PiotrN
W danych z kanału w którym jest kodowanie iso-8859-2 zjada/pomija polskie znaki.
W danych z kanału z kodowaniem utf-8 wszystko ok

Kurczę! Już myślałem że wszystko ok, bo zauważyłem że już nic nie wywala.
Bardzo proszę o dalszą pomoc i dziękuję za dotychczasową.
Athlan
To spróbuj pominąć kodowanie wejściowe (niech wykrywa sam):
  1. $out[1] = mb_convert_encoding($out[1], 'iso-8859-2');
PiotrN
Kanał z iso-8859-2 - w miejscu polskich znaków jest "?".
Kanał z utf-8 - krzaki.
sadsmiley02.gif

Przy tym w lastRSS.php:
  1. $out[1] = mb_convert_encoding($out[1], 'iso-8859-2', 'utf-8');


Usunełem w tym przykładzie "Multilingual Agregator" wiersz 69 i kanał z iso działa, ale z utf nie.

vokiel
To może sprawdzaj w jakim kodowaniu jest kanał i zmieniaj tylko ten, który jest w niewłaściwym. Do sprawdzenia kodowania możesz użyć
  1. mb_detect_encoding

Jeśli mb_convert_encoding nie działa poprawnie, to możesz użyć też iconv

Albo konwertować kody pojedynczych znaków http://4programmers.net/PHP/FAQ/Jak_zmieni..._funkcji_iconv_
PiotrN
Przecież piszę mb_convert_encoding ani mb_detect_encoding nie działa, a w pierwszym poście jest wyraźnie użyte iconv - więc po co mam to sprawdzać i używać?

iconv z pierwszego postu:
  1. $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);


Pomóżcie! Może macie jakiś inny kod, który na stronie z iso-8859-2 wyświetlałby poprawnie znaki utf-8 z kanału RSS?
vokiel
mb_convert_encoding nie jest wymienne z mb_detect_encoding (pierwsza funkcja konwertuje, druga sprawdza kodowanie), użycie tego to:
  1. $out[1] = mb_convert_encoding($out[1], 'iso-8859-2', mb_detect_encoding($out[1]));


Może błąd jest w kodowaniu, trzeba sprawdzić czy nagłówki są zgodne z kodowaniem treści. Zresztą przed samym konwertowaniem dobrze byłoby sprawdzać, czy kanał wymaga konwertowania.
PiotrN
  1. $out[1] = mb_convert_encoding($out[1], 'iso-8859-2', mb_detect_encoding($out[1]));

- nie działa.
Efekt:
Na początku wywala:
Warning: mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified in C:\wamp\www\rss2\lastRSS.php on line 107

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified in C:\wamp\www\rss2\lastRSS.php on line 107

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified in C:\wamp\www\rss2\lastRSS.php on line 107

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified in C:\wamp\www\rss2\lastRSS.php on line 107

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified in C:\wamp\www\rss2\lastRSS.php on line 107

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified in C:\wamp\www\rss2\lastRSS.php on line 107

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified in C:\wamp\www\rss2\lastRSS.php on line 107

i w wersji z kodowaniem iso-8859-2 zjada litery. Wersja z utf-8 działa.

Tak jak wspomniałem w pierwszym poście kod mam z http://lastrss.oslab.net/index.php?q=doc/examples - "Multilingual Agregator" + plik lastRSS.php (w zakładce "Download"). Wszystkie utf-8 zastąpiłem iso-8859-2 - w obu plikach. Majstrowałem przy wierszu 106 w pliku lastRSS.php i jestem w 99% pewny że to tam trzeba szukać.

Zależy mi na prostym kodzie, który czyta kanał RSS w utf-8 i wyświetla go na stronie z kodowaniem iso-8859-2.
vokiel
A próbowałeś korzystać z tego skryptu tak jak jest, ale z podaniem ustawieniem kodowania wynikowego w zmiennej $cp?
PiotrN
Mam tak (lastRSS.php):
  1. // -------------------------------------------------------------------
  2. // Public properties
  3. // -------------------------------------------------------------------
  4. var $default_cp = 'iso-8859-2';
  5. var $CDATA = 'nochange';
  6. var $cp = 'utf-8';
  7. var $items_limit = 0;
  8. var $stripHTML = False;
  9. var $date_format = '';

  1. // If code page is set convert character encoding to required
  2. if ($this->cp != '')
  3. //$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]);
  4. $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);

i wywala mi: Notice: Undefined property: lastRSS::$rsscp in C:\wamp\www\rss2\lastRSS.php on line 106, a kodowanie działa poprawnie. Co zmienić żeby tego nie wywalało?
Athlan
Cześć,

ukryj error_reporting, aby nie pokazywało noticów, lub zadeklaruj z początku lastRSS::$rsscp = null; (jeżeli niepotrzebne).
PiotrN
o dzięki Athlan! smile.gif Byłbym Ci wdzięczny gdybyś napisał co mam w sumie dodać do kodu.
Czy przy tym error_reporting są że tak powiem jakieś "skutki uboczne"?

Drugi sposób odpada.
Athlan
Skutków ubocznych nie ma. Poziom notice m.in. to informacja, że próbujesz dodać coś do niezadeklarowanej wcześniej zmiennej. Język PHP ma tę zaletę (lub w wielu przypadkach wadę), że można nie deklarować zmiennych i się do nich odwoływać. Nie jest to dobra praktyka, ale pehap taki już jest, tak samo nie ma czegoś takiego jak typy danych przy zmiennych - każda zmienna = każdy typ.

Wystarczy, że gdzieś na początku kodu dodasz:
  1. error_reporting(E_ALL & ~E_NOTICE); // kopia z manuala, trochę ambicji...


Skutki uboczne natomiast wygenerujesz sobie, gdy będziesz miał wyłączone error_display. Wtedy do błędów nie dotrzesz, pozostaną tylko logi serwera.

Pamiętaj na przyszłość (może nie w tym przypadku):
Cytat
Note:

Enabling E_NOTICE during development has some benefits. For debugging purposes: NOTICE messages will warn you about possible bugs in your code. For example, use of unassigned values is warned. It is extremely useful to find typos and to save time for debugging. NOTICE messages will warn you about bad style. For example, $arr[item] is better to be written as $arr['item'] since PHP tries to treat "item" as constant. If it is not a constant, PHP assumes it is a string index for the array.
PiotrN
Wielkie dzięki Athlan! yahoo.gif
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.