Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: parser xml - problem z polskimi znakami
Forum PHP.pl > Forum > XML, AJAX > XML
j4q8
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
wry
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
teutates
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:)
Black-Berry
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 ?
marrrecki
to powinno pomóc. Tylko dostosuj do swoich potrzeb
  1. <?php
  2. $nazwa = iconv("UTF-8", "ISO-8859-2", $produkt['nazwa']);
  3. ?>
kiraSi
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?

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


POzdrawiam
erix
Może byś tak popatrzył na datę pisania posta...?
MaxRipper
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.  
SATIO
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...
kwantOne
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)
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-2024 Invision Power Services, Inc.