Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> parser xml - problem z polskimi znakami
j4q8
post 4.06.2007, 13:05:31
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 4.06.2007

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


Witam !

Mam mały problem ze skryptem do parsowania xml-la.
W momencie kiedy wprowadzę polski znak, skrypt
obcina mi wszystko co się znajduje przed znakiem.
Np. w pliku xml mam:
"Ala ma łabędzia."

Po przeprzeparsowaniu wyświetla mi się samo:
"łabędzia."

Kodowanie w plikach ustawiłem na UTF-8.

Poniżej załączam skrypt:
  1. <?php
  2. $xml_file = "quotes.xml";
  3. $xml_text_key = "*QUOTES*QUOTE*TEXT";
  4. $xml_author_key = "*QUOTES*QUOTE*AUTHOR";
  5. $quotes_array = array();
  6. $counter = 0;
  7. class xml_quotes{
  8. var $text, $author;
  9. }
  10.  
  11. function startTag($parser, $data){
  12. global $current_tag;
  13. $current_tag .= "*$data";
  14. }
  15.  
  16. function endTag($parser, $data){
  17. global $current_tag;
  18. $tag_key = strrpos($current_tag, '*');
  19. $current_tag = substr($current_tag, 0, $tag_key);
  20. }
  21.  
  22. function contents($parser, $data){
  23. global $current_tag, $xml_text_key, $xml_author_key, $counter,
  24. $quotes_array;
  25. switch($current_tag){
  26. case $xml_text_key:
  27. $quotes_array[$counter] = new xml_quotes();
  28. $quotes_array[$counter]->text = $data;
  29. break;
  30. case $xml_author_key:
  31. $quotes_array[$counter]->author = $data;
  32. $counter++;
  33. break;
  34. }
  35. }
  36.  
  37. $xml_parser = xml_parser_create();
  38. xml_set_element_handler($xml_parser, "startTag", "endTag");
  39. xml_set_character_data_handler($xml_parser, "contents");
  40. $fp = fopen($xml_file, "r") or die("Could not open file");
  41. $data = fread($fp, filesize($xml_file)) or die("Could not read file");
  42. if(!(xml_parse($xml_parser, $data, feof($fp)))){
  43. die("Error on line " . xml_get_current_line_number($xml_parser));
  44. }
  45.  
  46. xml_parser_free($xml_parser);
  47. fclose($fp);
  48. $x = rand(1,count($quotes_array)-1);
  49. echo $quotes_array[$x]->text . " - " . $quotes_array[$x-1]->author;
  50. ?>


KB
Go to the top of the page
+Quote Post
wry
post 9.06.2007, 14:20:28
Post #2





Grupa: Zarejestrowani
Postów: 32
Pomógł: 3
Dołączył: 9.06.2007

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


dolaczam sie do pytania bo trafilem na ten sam problem nie wiem czy wogle jest mozliwosc wyciagniecia polskich znakow z xmla kodowanego w iso-8859-1


--------------------
Go to the top of the page
+Quote Post
teutates
post 27.06.2007, 18:33:31
Post #3





Grupa: Zarejestrowani
Postów: 156
Pomógł: 2
Dołączył: 9.09.2006
Skąd: Londyn/Gdynia

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


Możena spróbowac kodowania utf-8 i przed kazdym polaczeniem z baza dac:
  1. SET NAMES utf8

Bo mialem ten sam problem z xml i u mnie pomoglo:)
Go to the top of the page
+Quote Post
Black-Berry
post 27.06.2007, 19:29:07
Post #4





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Cytat(teutates @ 27.06.2007, 19:33:31 ) *
Możena spróbowac kodowania utf-8 i przed kazdym polaczeniem z baza dac:
  1. SET NAMES utf8

Bo mialem ten sam problem z xml i u mnie pomoglo:)
Może ja czegoś nie rozumiem ale co ma wspólnego XML i SQL ?

Dołaczam się do pytania. Miałem to samo i musiałem najpierw zamieniać wszystko w zrodlowym pliku xml z ą na #a; z ł na #l a potem po parsowaniu na nowo zamieniać.

Dodatkowo parser sypał się przy pobieraniu długich ciągów znaków. Miałeś tez takie coś może ?


--------------------
Go to the top of the page
+Quote Post
marrrecki
post 30.06.2007, 18:51:38
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Lublin

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


to powinno pomóc. Tylko dostosuj do swoich potrzeb
  1. <?php
  2. $nazwa = iconv("UTF-8", "ISO-8859-2", $produkt['nazwa']);
  3. ?>
Go to the top of the page
+Quote Post
kiraSi
post 19.01.2009, 15:14:20
Post #6





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 4.12.2008

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


Witam mam podobny problem, ale jeszcze przed uzycie poleconej funkcji mam krzaki. po uzyciu
$wart = iconv("UTF-8", "ISO-8859-2", $wart);

sa polskie litery i wydawaloby sie super gdyby nie to ze obcina czesc zdania az do momentu wystapienia polskiego znaku .
Poradzil moze sobie ktos juz tym problemem?

Go to the top of the page
+Quote Post
bikebog
post 4.08.2009, 23:15:10
Post #7





Grupa: Zarejestrowani
Postów: 44
Pomógł: 1
Dołączył: 12.04.2006

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


Panowie to Wam pomoże smile.gif
  1. <?
  2. iconv('utf-8','iso-8859-2//TRANSLIT', $title);
  3. ?>


POzdrawiam

Ten post edytował bikebog 4.08.2009, 23:21:26
Go to the top of the page
+Quote Post
erix
post 4.08.2009, 23:37:40
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Może byś tak popatrzył na datę pisania posta...?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
MaxRipper
post 8.02.2011, 16:03:38
Post #9





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 19.08.2003
Skąd: Białystok

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


Ci którzy wciąż maja problem z kodowaniem (wiem ze pytanie było zadane w 2007 roku) powinni pamiętać o kodowaniu odwrotnym (reverse encoding), które w przypadku odczytu danych z zewnętrznych plików jest poprawnym zastosowaniem funkcji iconv().

Przykładowo:
  1. $string = "zawartosc pliku pobranego z zewnetrznego serwera np. kursy walut"; // wiemy ze kodowanie zrodla to UTF-8
  2.  
  3. //Nasza strona ma kodowanie tradycyjne czyli ISO-8859-2 - tym samym stosujac reverse encoding musimy:
  4. $string = iconv('ISO-8859-2//IGNORE', 'UTF-8', $string);
  5.  
  6. // I otrzymujemy kodowanie w ISO
  7. echo $string;
  8.  
  9. // Voila! :)
  10.  


Ten post edytował MaxRipper 8.02.2011, 16:05:34


--------------------
eNetwiz.com - Technologie dla biznesu
Go to the top of the page
+Quote Post
SATIO
post 26.03.2011, 00:49:01
Post #10





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 5.12.2010
Skąd: Gdańsk

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


To temat rzeka, okazuje się, że najwygodniejszym rozwiązaniem, jest zrobienie klasy do automatycznej detekcji kodowania i przed każdą operacją odczytu/zapisu sprawdzenie, czy konieczna jest konwersja i tutaj żadne proste przepisy nie wchodzą w grę, bawiłem się w to i trochę kodu to zajęło... a nie proste iconv itd...


--------------------
Sapletta.pl - Programista PHP, Gdańsk
Go to the top of the page
+Quote Post
kwantOne
post 5.07.2011, 07:03:14
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 5.07.2011
Skąd: Bydgoszcz

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


Kluczem do rozwiązania tego problemu jest fragment z manuala PHP dotyczący funkcji xml_set_character_data_handler() :
Character data handler is called for every piece of a text in the XML document. It can be called multiple times inside each fragment (e.g. for non-ASCII strings).

Parsowanie dla pliku:

  1. <zadanie>
  2. Siała baba mak i jeszcze kilka polskich znaków: ąćśń
  3. </zadanie>


Spowoduje dwukrotne wykonanie funkcji przypisanej jako handler do funkcji xml_set_character_data_handler()

Można to samemu sprawdzić przypisując jako handler do funkcji xml_set_character_data_handler() poniższą funkcję (dodającą podkreślenie przed "wyparsowanym" stringiem):
  1. function daneHandler($parser, $dane){
  2. echo '_',$dane;
  3. }


Funkcja ta da nam w wyniku:
Kod
_Sia_ła baba mak i jeszcze kilka polskich znaków: ąćśń


Jak widać funkcja została wywołana dwukrotnie. Podkreślenie zostało dodane na początku parsowanych danych i następnie przed pierwszym polskim znakiem. kolejne polskie znaki nie wywołują już ponownego wykonania funkcji.

Właśnie ta specyfika działania funkcji xml_set_character_data_handler() powodowała występowanie problemu z, jak mogło się wydawać, kodowaniem znaków.

Pozdrawiam (temat trochę stary ale może moja odpowiedz się komuś przyda, wątek w Google wyskakuje dość wysoko)

Ten post edytował kwantOne 5.07.2011, 07:35:07
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: 6.05.2025 - 05:47