Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Czytnik kanału RSS - Problem ze zmianą kodowania, Z utf-8 na iso-8859-2
PiotrN
post 26.12.2010, 17:41:02
Post #1





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


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".

Ten post edytował PiotrN 26.12.2010, 17:43:33
Go to the top of the page
+Quote Post
Athlan
post 26.12.2010, 18:05:28
Post #2





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


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.


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
PiotrN
post 26.12.2010, 18:18:06
Post #3





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
Athlan
post 26.12.2010, 18:19:32
Post #4





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


To spróbuj pominąć kodowanie wejściowe (niech wykrywa sam):
  1. $out[1] = mb_convert_encoding($out[1], 'iso-8859-2');


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
PiotrN
post 26.12.2010, 18:25:10
Post #5





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


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.



Ten post edytował PiotrN 26.12.2010, 19:02:22
Go to the top of the page
+Quote Post
vokiel
post 26.12.2010, 19:05:37
Post #6





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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_


--------------------
Go to the top of the page
+Quote Post
PiotrN
post 26.12.2010, 19:20:23
Post #7





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


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?

Ten post edytował PiotrN 26.12.2010, 19:21:21
Go to the top of the page
+Quote Post
vokiel
post 26.12.2010, 20:02:44
Post #8





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
PiotrN
post 26.12.2010, 21:15:08
Post #9





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
vokiel
post 26.12.2010, 21:44:40
Post #10





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


A próbowałeś korzystać z tego skryptu tak jak jest, ale z podaniem ustawieniem kodowania wynikowego w zmiennej $cp?


--------------------
Go to the top of the page
+Quote Post
PiotrN
post 27.12.2010, 17:18:40
Post #11





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


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?

Ten post edytował PiotrN 27.12.2010, 17:19:15
Go to the top of the page
+Quote Post
Athlan
post 27.12.2010, 19:30:59
Post #12





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


Cześć,

ukryj error_reporting, aby nie pokazywało noticów, lub zadeklaruj z początku lastRSS::$rsscp = null; (jeżeli niepotrzebne).


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
PiotrN
post 27.12.2010, 19:52:17
Post #13





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował PiotrN 27.12.2010, 19:58:25
Go to the top of the page
+Quote Post
Athlan
post 27.12.2010, 21:37:46
Post #14





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


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.


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
PiotrN
post 27.12.2010, 22:25:10
Post #15





Grupa: Zarejestrowani
Postów: 73
Pomógł: 0
Dołączył: 8.05.2010

Ostrzeżenie: (0%)
-----


Wielkie dzięki Athlan! yahoo.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 01:45