Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [xml/php5] Kodowanie - polskie znaki
slawa
post 22.02.2006, 13:52:42
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 8.02.2005

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


Mam plik xml o nastpujcej postaci:
  1. <?xml version="1.0" encoding="ISO-8859-2"?>
  2. <a>
  3. <b>ąąśśźźżżććńńóółł<b>
  4. </a>


Wyciągam z niego informację zawartą w <b></b> za pomoca php5:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  5. <title>XML - Technologia XPath</title>
  6. </head>
  7. <body>
  8. <p>śćźżńóąłłłżżżżżżźźźź</p>
  9. <?
  10. $file_name="e.xml";
  11. function getElementa ($file_name,$elementName)
  12. {
  13. $doma = new DomDocument(); 
  14. $doma->load($file_name);
  15. $titles = $doma->getElementsByTagName($elementName);
  16. $k=0;
  17. foreach($titles as $node) 
  18. { 
  19. $x[$k]= $node->textContent;
  20. $k++;
  21. }
  22. return $x;
  23. }
  24. $a=getElementa($file_name,'b');
  25. echo $a[0];
  26. ?>
  27. </body>
  28. </html>


Z tym ze zamiast dostać to co chcę dostaje jakieś krzaki, zamiast polskich znaków. Wiem ze problem tkwi w standardzie kodowania. Wszystko robie pod windowsem, pliki xml w edytorze xmlspy. W przeglądarce, bez przetworzenia przez php są ok, tzn są polskie znaki.
Może ktoś wie dlaczego tak się dzieje?

----------------------------------------------------------------------------------------------
Problem rozwiązał się sam. Chodziło o błedne kodowanie przez edytor, po zamianie na utf-8 juz działa

Ten post edytował slawa 22.02.2006, 17:48:44
Go to the top of the page
+Quote Post
splatch
post 27.02.2006, 19:52:33
Post #2





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


getElementsByTagName ma niewiele wspólnego z XPath - chyba, że DOM wywołuje pod machą jakieś zapytanie w XPath. Odpowiednikiem getElementsByTagName(tag-name) jest zapytanie //tag-name


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Alkagar
post 20.06.2006, 13:55:00
Post #3





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 18.12.2005

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


witam,
pisze tutaj bo szkoda zakładać nowego tematu :-P

mam prawie taki sam problem.

Sa sobie 3 pliki: jeden plik xml, drugi plik php i trzeci tez plik php :-)
w pierwszym xml-u mam newsy z polskimi znakami kodowanie ustawilem na iso.
w drugim pliku mam clase xml_news w ktorej mam wczytanie danych przez simplexml do tablicy i wyswietleniem w osobnej funkcji przez echo.
w trzecim pliku natomiast jest strona głowna w ktorej includuje sobie plik drugi i wywoluje metode wyswietlajaca mi dane pobrane z pliku. Kodowanie ustwiam tylko w pliku trzecim na iso, no i oczywiscie na encoding='iso-8859-2' w pliku xmla.

Wie ktos czemu to moze nie działać?? Nie działać = wyswietlać rozne krzaczki ciekawe, w kazdym razie nie pokazuje tego co powinno.

Pozdrawiam,
Alk


--------------------
I amar prestar aen
Go to the top of the page
+Quote Post
webik
post 27.06.2006, 15:36:50
Post #4





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 1.05.2006
Skąd: Leżajsk\Kraków

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


Witam do Alkagar

mialem ten sam problem sproboj ustawic kodowanie w php przez wysłanie odpowedniego Headera

  1. <?php
  2. header('Content-Type: text/html; charset = ISO-8859-2');
  3. ?>


powinno pomoc mialem podobny problem na jednym z zagranicznych serwerów

natomiast jezeli chodzi o problem slawa to... albo to samo co wyżyej (sprobój) albo zapisales plik w formacie innym niz podany w encoding w XML

pozdrawiam


--------------------
Errare humanum est
Go to the top of the page
+Quote Post
Alkagar
post 28.06.2006, 09:56:00
Post #5





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 18.12.2005

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


Miałem to tylko, że to nie działa sad.gif.

Ale udało mi się to rowziązać w inny sposób : - D.

problem tkwił w zmianie kodowania przy zapisie pliku (chyba smile.gif )

Link do rozwiązania bardziej od strony php
Temat: System plikow

Pozdrawiam,
Alk


--------------------
I amar prestar aen
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 11:29:19
Post #6





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


Też miałem ten problem, znalazłem na to takie na około rozwiązanie. Ogólnie mam wrażenie, że jest to błąd php.. ale nie mam pewności może to jest prawidłowe zachowanie. Do czego doszedłem:
Jak ładujesz poprzez DOMDocument->load() plik w innym kodowaniu niż utf-8 (oczywiście z nagłówkiem informującym o tym kodowaniu) DOMDocument ładuje ten plik prawidłowo, odczytuje kodowanie.. można to sprawdzić poprzez DOMDocument->saveXML() php wypluwa dokument w tym kodowaniu w jakim je dostał, żadnych krzaków nie ma.
Jednak jeśli spróbujemy wyciągnąć z tego dokumentu zawartość, którejkolwiek gałęzi albo zrobimy DOMDocument->saveXML(node) gdzie node jest którąś z gałęzi dokumentu.. php wypluje już nam dane przyjmując, że dokument jest w kodowaniu utf-8.. czyli zamiast polskich znaków przesłanych w iso pojawią się krzaki.
Jedyny sposób na to jaki znalazłem to rekonwertowanie zwróconego ciągu znaku spowrotem na iso. Do końca nie jest dla mnie jasne czemu ale to zadziałało.. przykładowo:
  1. <?php
  2. $node->nodeValue = mb_convert_encoding($node->nodeValue, 'iso-8859-2', 'utf-8');
  3. ?>

Po tym zabiegu wywołanie $node->nodeValue zwraca już dane tak jak tego oczekujemy.

Ja na ten problem natrafiłem eksperymentując z innymi kodowaniami. Generalnie chociażby ze względu na powyższe uważam, że lepiej nie bawić się w xml'e zapisane w iso tylko przejść na kodowanie 'utf-8' które jest przecież domyślnym kodowaniem xml. Wtedy można uniknąć wielu podobnych problemów.
Przykładowo jak wprowadzicie do zawartości gałęzi encje do znaków, które iso nie posiada? saveXML() zamieni wszystkie '&' na '& a m p ;' i nici z encji smile.gif
Go to the top of the page
+Quote Post
Alkagar
post 28.06.2006, 11:46:21
Post #7





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 18.12.2005

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


No tak, z checią bym tak zrobił (znaczy zmienił kodowanie pliku xml z win1250 na iso) tylko ze ja zapisuje sobie do tego pliku dane przez zwykłe funkcje plikowe. Dlatego zmienia mi sie format zapisanych danych zawsze na win. Jedynym rozwiązaniem tego problemu jest właśnie odczytanie danych i pozniejsza ich konwersja (według mnie).

Co do tego błędu w php co mówisz to jeżeli SAX (to takie do obsługi xml-a w php, chyba tak sie to nazywa :-P ) działa tak samo jak simplexml to to raczej nie jest błąd. Simplexml przetwarza dane i mają one zawsze wyjsciowe kodowanie utf-8 bo w takim kodowaniu powinien być plik xml(według mnie) i dlatego wyjście jest zawsze na utf-8 niezależnie od tego jaki format jest na wejściu.

P.S. może znasz jakąś funkcje którą możesz zmienić kodowanie już zapisanego pliku *.txt bądź *.xml??

Pozdrawiam,
Alk


--------------------
I amar prestar aen
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 11:53:33
Post #8





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


utf-8 jest domyślnym kodowaniem xml ale to nie znaczy, że nie można czy nie powinno sie używać innych kodowań. I tak samo powinny moim zdaniem zachowywać się rozszerzenia php do XML tymbardziej jeśli odczytują informację o kodowaniu znaków (rozszerzenie DOM to robi).
Co do konwersji kodowania to ja korzystam z mb_convert_encoding() z roszerzenia mbstring ale wiem, że wielu woli używać rozszerzenie iconv, kwestia upodobań smile.gif
Go to the top of the page
+Quote Post
Alkagar
post 28.06.2006, 12:01:28
Post #9





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 18.12.2005

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


hmmm...
a czy mb_convert_encoding obsługuje konwersje pomiędzy np. iso i win? alo win - utf?
Z tego co wiem to nie ma takiej możliwości przy użyciu iconv (też próbowałem przy tym problemie co miałem i jedynym rozwiązaniem okazało się użyciue funkcji zewnętrznych pozwalających na konwersje)


--------------------
I amar prestar aen
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 12:07:07
Post #10





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


hmm.. no właśnie mam wrażenie, że mb_convert_encoding() nie bierze tego naszego kodowania win.. i cholera nie mam pojęcia czemu, bo parę innych kodowań win bierze.. Sprawdź to dokładnie. Jeśli iconv ma podobne ograniczenie to jestem bezradny.
Ale.. dlaczego pliki php zapisuje Ci w kodowaniu win. Z tego co wiem da się na to wpływać i możesz ustawić aby php zapisywało pliki w wybranym przez Ciebie kodowaniu.
Go to the top of the page
+Quote Post
Alkagar
post 28.06.2006, 12:14:57
Post #11





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 18.12.2005

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


1) iconv na pewno nie obsługuje win1250 (99%).
2) co do ustawienia w jakim formacie ma zpaisywać pliki to sie nie spotkałem jeszcze, jak wiesz jak to zrobić to byłbym wdzięczny za jakiś kod, link czy chociaż nawe funkcji :-)


--------------------
I amar prestar aen
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 12:28:15
Post #12





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


Kiedyś widziałem jakiś przykład, który stosował mb_internal_encoding() i myślę, że to załatwia sprawę. Nie mniej upewnij się.
Go to the top of the page
+Quote Post
poncjusz
post 28.06.2006, 23:04:13
Post #13





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 20.01.2004

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


Podpinam sie do tematu, rowniez mam problem z kodowanie xml. W bazie znaki sa zapisane prawidlowo, wyciagam wszystko z bazy i probuje zapisac do pliku xml, ktory niestety juz mi "krzaczy". Plik musze zapisac w utf-8 bo pozniej parsuje we Flashu ktory tylko takie kodowanie mi akceptuje. Fragment kodu ktory odpowiada za przetwarzanie:
  1. <?php
  2. $doc = new DOMDocument('1.0');
  3. $root = $doc-> createElement ( 'image' );
  4. $root = $doc-> appendChild ( $root );
  5.  
  6. $resResult = $db-> Execute ( 'SELECT admin_product.image, admin_product.name, admin_product.height, admin_prod
    uct.width, admin_product.code FROM category_product, admin_product WHERE category
    _product.id_category =".$this-> fileId." AND admin_product.id = category_product.id_product'
     );
  7.  
  8. $elements = $resResult-> GetAll();
  9.  
  10. foreach ( $elements as $element )
  11. {
  12. // dla kazdego rekordu tworze element <pic>
  13. $item = $doc-> createElement('pic');
  14.  
  15. // dolaczam go do drzewa glownego aplikacji
  16. $item = $root->appendChild($item);
  17.  
  18. // teraz dla kazdego elementu danego rekordu pobieram jego nazwe i wartosc
  19. foreach ( $element as $elementname => $elementvalue )
  20. {
  21. if ( $elementname=='image')
  22. {
  23. $elementvalue = 'oferta/'.$path.$elementvalue;
  24. }
  25.  
  26. // tworze element o podanej nazwie kolumny
  27. $elementname = $doc-> createElement($elementname);
  28.  
  29. // dolaczam do elementu <pic>
  30. $elementname = $item-> appendChild($elementname);
  31.  
  32. // do utworzonego przed chwilą elementu podaję dodaje węzeł tekstowy - wartosc danej kolumny
  33. $elementname->appendChild($doc-> createTextNode(htmlspecialchars($elementvalue)));
  34. }
  35. }
  36.  
  37. $doc-> save('../xml/'.$this-> filename.'.xml');
  38. ?>


Wiem ze to cos z xmlem bo jesli w foreach wyswietalam sobie $elementvalue to prezentuje mi prawidlowo, bylbym bardzo wdzieczny za pomoc
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 23:09:22
Post #14





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


ale co Ci się krzaczy? Jak otwierasz zapisany plik widzisz krzaczki (w czym go oglądasz)? Jak próbujesz go spowrotem władować poprzez php są krzaczki?
Go to the top of the page
+Quote Post
poncjusz
post 28.06.2006, 23:16:39
Post #15





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 20.01.2004

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


Tak otwierając dany plik, mam same krzaczki! Jak pisze wszystko jest ok do momentu zapisu do pliku
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 23:19:46
Post #16





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


ponawiam pytanie -> w czym oglądasz ten plik? Może program, w którym oglądasz nie obsługuje bądź przyjmuje inne kodowanie niż kodowanie utf-8
Go to the top of the page
+Quote Post
poncjusz
post 28.06.2006, 23:27:01
Post #17





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 20.01.2004

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


Ogladam go w Zendzie, ale to nie o to chodzi, moge go nawet nie ogladac i tak nie jest to poprawny utf-8, strona dla ktorej robilem panel to: www.gosia.com.pl/main.html (uwaga Flash!), wejdzcie w dzial 'Dewocjonalia' i tam pare pierwszych przegladnijcie, tak wygladaja znaki...
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 23:34:24
Post #18





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


Ok.. czy strona, którą wyświetlacz by sprawdzić poprzez foreach wyniki (wtedy jest ok, jak piszesz) wyświetla się w kodowaniu 'utf-8'?
Go to the top of the page
+Quote Post
poncjusz
post 28.06.2006, 23:38:13
Post #19





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 20.01.2004

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


Nie, kodowanie jest ustawione na stronie na iso-8859-2, byc moze to w ustawieniach porownan znakow i zapytan mysql w bazie, obecnie mam obydwa na latin2-general-ci, to juz jutro sprawdze, napisz prosze czy to moze byc przyczyna?

Ten post edytował poncjusz 28.06.2006, 23:39:12
Go to the top of the page
+Quote Post
mariuszn3
post 28.06.2006, 23:42:38
Post #20





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


aha.. no to wszystko jasne. Dodajesz dane zapisane w iso-8859-2 jako utf-8. Musisz je przekonwertować na utf-8 przed dodaniem do drzewa DOM.
Bazę możesz zostawić jak jest, choć na przyszłośc polecam korzystać tylko z utf-8. Ważne by dane dodawane do DOM były w kodowaniu utf-8.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 - 06:54