Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z parsowaniem różnych plików xml o róznych kodowaniach.
Forum PHP.pl > Forum > PHP
Sajrox
Witam,

Już 4 a ja nie mogę poradzić z tym problemem sad.gif

Niestety nikt jeszcze nie poruszył tego tematu.

A wiec, posiadam skrypt który parsuje różne pliku xml różnych porównywarek cen. Wiadomo że zdarza się że pliki xml mają różne kodowania, jeden UTF-8 inny ISO-8859-2 lub windows-1250.
I tutaj zaczyna się problem. Nie mogę skonwertować tych różnych kodowań do jednego wspólnego UTF-8 bo w takim mam zakodowaną stronę.
Stosując kod:
  1. <?php
  2. $text = mb_convert_encoding($text, 'UTF-8', mb_detect_encoding($text, 'UTF-8, ISO-8859-2, ISO-8859-1, ASCII', true));
  3. ?>


Dla jednych przypadkó działa dla innych nie.
Stosująć kod:
  1. <?php
  2. $text = mb_convert_encoding($text, 'ISO-8859-2', mb_detect_encoding($text, 'UTF-8, ISO-8859-2, ISO-8859-1, ASCII', true));
  3. ?>


Działa jakby na odwrót niż 1 przykład.
Czy nie jest jakieś rozwiązanie aby wszystki pliki kodowało do UTF-8 wyświetlająć polskie znaki ?
Podany wyżej kod:
  1. <?php
  2. $text = mb_convert_encoding($text, 'UTF-8', mb_detect_encoding($text, 'UTF-8, ISO-8859-2, ISO-8859-1, ASCII', true));
  3. ?>

Działa tylko dla niektórych przykładów, a mi zalezy aby działał dla wszystkich plików.


Proszę o pomoc Panowie. Problem jest i trzeba go jakoś rozwiązać smile.gif

Dodam także że
  1. <?php
  2. $text = iconv(iconv_get_encoding($text), 'UTF-8', $text);
  3. ?>


Także nie działa dla wszystkich plików xml. :/
lor
pliki xml zawierają w sobie deklaracje dt kodowania wygląda to tak:

Kod
<?xml version="1.0" encoding="iso-8859-2" ?>


Miałem kiedyś podobny problem jak Ty przy parsowaniu rss, oprócz zmiany kodowania dokumentu, należy zmienić nagłówek na odpowiedni.
Sajrox
No właśnie w tym kłopot że plik jest parsowany z adresu URL. Dlatego ciężko będzie zmienić tutaj nagłówek dt. kodowania.
Dodam że używam metody XMLReader.

W nagłówkach plików xml jest wszędzie
  1. <?xml version="1.0" encoding="ISO-8859-2"?>


Jednak po konwersji wygląda na to że jednak są one w różny sposób kodowane sad.gif
Ogólnie zależy mi na tym aby aby wykryć kodowanie pliku oraz wykryć na jakie kodowanie powinien być zamieniony (zmiana na UTF-8 nie we wszystkich przypadkach plików xml daje zadowalający efekt)

Przy używaniu SAXa wszystko było ok. Bez problemu byłem w stanie zmienić każde kodowanie na UTF-8 jednak przy XMLReader jest już kłopot.

Czy ktoś ma jakieś pomysły ?
lor
Żeby sprawdzić kodowanie zapisane w pliku użyłem:



Kod
  $rssHandle = fopen($adres,"r");

  while (!feof($rssHandle)) {
  $rssData .= fgets($rssHandle);
  }

  preg_match( '@<\?xml.+encoding="([^\s"]+)@si', $rssData, $matches );
  $mime = 'application/xml';
  if ( isset( $matches[1] ) )
  $charset = $matches[1];



i do tego proponuje funkcję get_headers()

Kod
$pobierz_naglowek = get_headers($adres, 2);


i teraz tylko wyciągnąć z $pobierz_naglowek['Content-Type'] kodowanie 

Na koniec trzeba przepisać cały plik ze zmienionym nagłówkiem, do tego zmienić kodowanie i ma działać smile.gif
Sajrox
No właśnie wszystko ładnie powinno działać ale nie działa.

Mam plik w którym jest coś takiego.

wpĹ&# 65533;ywajÄ&# 65533; na zwiÄ&# 65533;kszenie

i włąsnie to za żadne skarby nie chce zamienić na polskie znaki sad.gif
Próbowałem już wszystkiego i nic. MOżesz sprawdzić u siebie czy u CIebie to konwertuje dobrze w twojej aplikacjo questionmark.gif
lor
Podaj więcej szczegółów, skąd ten string pochodzi, w jakich warunkach poprawnie się wyświetla to spróbujemy coś zaradzić. Ciekaw jestem rozwiązania ale narazie rozkładam ręce.
erix
Spróbuj tego: http://pl.php.net/manual/pl/function.mb-de...oding.php#68893
Sajrox
Już wyjaśniam.
String pochodzi z pliku xml.
http://www.aptekadodomu.pl/data/export/nok...de61ec23aa1.xml

W ogóle poprawnie się nie wyświetla, przy użyciu metody XMLReader do parsowania dokumentu xml.

Próbowałem różne kombinacje kodowań. Zmieniałem nagłówek header. Zmieniałem zestaw znaków w przeglądarce i wszystko na nic.

Po prostu ręce opadają :/

Kod który używam
  1. <?php
  2. function convertPl($value)
  3. {
  4.     // TUTAJ TRZEBA ZROBIC COS ABY ZAMIENIALO WSZYSTKIE KRZAKI NA POLSKIE ZNAKI
  5.     return trim($value);
  6. }
  7.  
  8. $reader = new XMLReader();
  9. $reader->open('http://www.aptekadodomu.pl/data/export/nokaut_10189cb641a5cde61ec23aa1.xml');
  10.  
  11. $count=0;
  12.  
  13. while($reader->read())
  14. {
  15.           if($reader->nodeType == XMLReader::ELEMENT)
  16.           {
  17.               $name = $reader->name;
  18.  
  19.               if ($reader->name == 'offer')
  20.                   $notes[$count] = array();
  21.           }
  22.  
  23.           if($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA)
  24.           {
  25.                   $notes[$count][$name] = convertPl($reader->value);
  26.           }
  27.  
  28.           if($reader->nodeType == XMLReader::END_ELEMENT)
  29.           {
  30.               if ($reader->name == 'offer')
  31.               {
  32.                     $count++;
  33.                }
  34.           }
  35.  
  36. // Ograniczenie do 10 wyników
  37.           if ($count > 10)
  38.                  break;
  39. }
  40.  
  41.  
  42. print_r($notes);
  43. exit();
  44. ?>
erix
Kodowanie w nagłówku pliku masz ustawione na ISO, a same znaki lecą po UTF-8...
Sajrox
czy nie można tego jakoś obejść ? Nie mam możliwości zmiany tego pliku. Mogę go tylko pobrać i przeparsować. :/

Wiem że można utworzyć nowy plik odczytując linia po linii. Jednak po tym zabiegu gdy zmienie nagłówek na UTF-8 XMLReader się sypie :/
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.