Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z kodowaniem
Forum PHP.pl > Forum > XML, AJAX > XML
czachor
Witam,
Mam prosty skrypt:
  1. <?php
  2. $xml_str = <<<XML
  3. <?xml version='1.0'?>
  4. <movies>
  5.  <movie>
  6.   <title>weź i przesuń tę wiśnię stąd</title>
  7.  </movie>
  8. </movies>
  9. XML;
  10. $xml_data = simplexml_load_string($xml_str);
  11.  
  12. print_r($xml_data);
  13. ?>

Niestety z polskich literek nici... Dostaję błędy:
Kod
Warning:  Entity: line 3: parser error : Input is not proper UTF-8, indicate encoding ! in index.php on line 10

Warning:     in index.php on line 10

Warning:             ^ in index.php on line 10

Warning:  Entity: line 4: error: Bytes: 0xBC 0x20 0x69 0x20 in index.php on line 10

Warning:     in index.php on line 10

Warning:             ^ in index.php on line 10

Wioskuję z tego, że mam ustawić kodowanie... Dodaję (encoding='iso-8859-2'), dostanę zrzut, ale z krzakami...:
Kod
SimpleXMLElement Object
(
    [movie] => SimpleXMLElement Object
        (
            [title] => weĹş i przesuĹ� tÄ� wiĹ�niÄ� stÄ�d
        )

)

Próbowałem z win-1250, utf-8 itp... i nic... W edytorze piszę oczywiście w iso... Inne zresztą też nie przynoszą efektów... Nie mam pojęcia, czego się czepić... Z góry dzięki za wszelką pomoc!
bela
Ustaw w przegladarce odpowiedni typ i zobacz. Ewentualnie wyslij odpowiedni header.
czachor
Niestety dalej bez zmian sad.gif

Heh, a da radę wstawiać w to polskie znaki? Wydaje mi się, że tak, ale np. na webcity.pl (http://webcity.pl/webcity/artykuly.php/t/53) przykłady są bez takich...
dr_bonzo
Jesli XML jest zapisany w innym kodowaniu niz Utf to musisz je zadeklarowac (tak jak zrobiles) "encoding='iso-8859-2'".

SimpleXML przecowuje wewnetrznie dane w UTF'ie, i wypluwa UTF

UTF jest systemem wielobajtowym (multibyte -- jeden znak jest opisany przez min. 1 bajt, nie jak w iso czy cp TYLKO jeden znak, utf-8 - znaki lacinskie opisuje jednym bajtem, a polskie ogonki dwoma bajtami -- co widac zamiast 1 polskiego znaku masz dwa "znaczki")

Kod
weź i przesuń tę wiśnię stąd
weź i przesu� t� wi�ni� st�d


1. Albo wyslij header z kodowaniem utf-8
2. albo przekonwertuj kazda wartosc pobierana z obiektu SimpleXMLElement.
czachor
Dzięki wielkie, dr_bonzo!

Przy użyciu iconv" title="Zobacz w manualu PHP" target="_manual wygląda to tak (dla pojedynczego pola):
  1. <?php
  2. $xml_conv = iconv('utf-8', 'iso-8859-2', $xml_data -> movie[0] -> title[0]);
  3. echo $xml_conv; //weź i przesuń tę wiśnię stąd
  4. ?>


Konwertuję całość narazie przy użyciu get_object_vars($xml_data)... Nie widzę innego rozwiązania (oprócz headera), ale obiekt będzie miał ok. 10-15 prostych właściwości, więc chyba specjalnie na wydajności nie stracę...? Wygląda to tak:
  1. <?php
  2. function utf2iso(&$arrData)
  3. {
  4. if (is_object($arrData))
  5. {
  6. $arrData = get_object_vars($arrData);
  7. array_walk($arrData, 'utf2iso');
  8. }
  9. else
  10. {
  11. $arrData = iconv('utf-8', 'iso-8859-2', $arrData);
  12. };
  13.  
  14. return $arrData;
  15. };
  16.  
  17. $xml_data = simplexml_load_string($xml_str); //$xml_string jak w pierwszym poście
  18.  
  19. $objVars = get_object_vars($xml_data);
  20. array_walk($objVars, 'utf2iso');
  21.  
  22. unset($xml_data);
  23. print_r($objVars); //ładna tablica w iso
  24. ?>

A tak poza tematem... Wie ktoś może, czym się różni w praktyce array_walk" title="Zobacz w manualu PHP" target="_manual od array_walk_recursive" title="Zobacz w manualu PHP" target="_manual?
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.