slawa
22.02.2006, 13:52:42
Mam plik xml o nastpujcej postaci:
<?xml version="1.0" encoding="ISO-8859-2"?>
<a>
<b>ąąśśźźżżććńńóółł<b>
</a>
Wyciągam z niego informację zawartą w <b></b> za pomoca php5:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<title>XML - Technologia XPath</title>
</head>
<body>
<p>śćźżńóąłłłżżżżżżźźźź</p>
<?
$file_name="e.xml";
function getElementa ($file_name,$elementName)
{
$doma = new DomDocument();
$doma->load($file_name);
$titles = $doma->getElementsByTagName($elementName);
$k=0;
foreach($titles as $node)
{
$x[$k]= $node->textContent;
$k++;
}
return $x;
}
$a=getElementa($file_name,'b');
?>
</body>
</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
splatch
27.02.2006, 19:52:33
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
Alkagar
20.06.2006, 13:55:00
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
webik
27.06.2006, 15:36:50
Witam do Alkagar
mialem ten sam problem sproboj ustawic kodowanie w php przez wysłanie odpowedniego Headera
<?php
header('Content-Type: text/html; charset = ISO-8859-2'); ?>
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
Alkagar
28.06.2006, 09:56:00
Miałem to tylko, że to nie działa

.
Ale udało mi się to rowziązać w inny sposób : - D.
problem tkwił w zmianie kodowania przy zapisie pliku (chyba

)
Link do rozwiązania bardziej od strony php
Temat: System plikowPozdrawiam,
Alk
mariuszn3
28.06.2006, 11:29:19
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:
<?php
$node->nodeValue = mb_convert_encoding($node->nodeValue, 'iso-8859-2', 'utf-8');
?>
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
Alkagar
28.06.2006, 11:46:21
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
mariuszn3
28.06.2006, 11:53:33
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ń
Alkagar
28.06.2006, 12:01:28
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)
mariuszn3
28.06.2006, 12:07:07
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.
Alkagar
28.06.2006, 12:14:57
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 :-)
mariuszn3
28.06.2006, 12:28:15
Kiedyś widziałem jakiś przykład, który stosował mb_internal_encoding() i myślę, że to załatwia sprawę. Nie mniej upewnij się.
poncjusz
28.06.2006, 23:04:13
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:
<?php
$doc = new DOMDocument('1.0');
$root = $doc-> createElement ( 'image' );
$root = $doc-> appendChild ( $root );
$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' );
$elements = $resResult-> GetAll();
foreach ( $elements as $element )
{
// dla kazdego rekordu tworze element <pic>
$item = $doc-> createElement('pic');
// dolaczam go do drzewa glownego aplikacji
$item = $root->appendChild($item);
// teraz dla kazdego elementu danego rekordu pobieram jego nazwe i wartosc
foreach ( $element as $elementname => $elementvalue )
{
if ( $elementname=='image')
{
$elementvalue = 'oferta/'.$path.$elementvalue;
}
// tworze element o podanej nazwie kolumny
$elementname = $doc-> createElement($elementname);
// dolaczam do elementu <pic>
$elementname = $item-> appendChild($elementname);
// do utworzonego przed chwilą elementu podaję dodaje węzeł tekstowy - wartosc danej kolumny
$elementname->appendChild($doc-> createTextNode
(htmlspecialchars($elementvalue))); }
}
$doc-> save('../xml/'.$this-> filename.'.xml');
?>
Wiem ze to cos z xmlem bo jesli w foreach wyswietalam sobie $elementvalue to prezentuje mi prawidlowo, bylbym bardzo wdzieczny za pomoc
mariuszn3
28.06.2006, 23:09:22
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?
poncjusz
28.06.2006, 23:16:39
Tak otwierając dany plik, mam same krzaczki! Jak pisze wszystko jest ok do momentu zapisu do pliku
mariuszn3
28.06.2006, 23:19:46
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
poncjusz
28.06.2006, 23:27:01
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...
mariuszn3
28.06.2006, 23:34:24
Ok.. czy strona, którą wyświetlacz by sprawdzić poprzez foreach wyniki (wtedy jest ok, jak piszesz) wyświetla się w kodowaniu 'utf-8'?
poncjusz
28.06.2006, 23:38:13
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?
mariuszn3
28.06.2006, 23:42:38
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.
poncjusz
29.06.2006, 09:15:48
Chyba nie o to chodzi do końca, bo np. w phpmyadmin-ie mam ustawione kodowanie na utf-8 i wyswietla sie prawidlowo, jezeli dodam jakis rekord do bazy (wpisując chociażby źżćó), przez phpmyadmina to zapisywane sa w bazie jako utf-8 a przy tworzeniu xml jest nie tak jak trzeba
mariuszn3
29.06.2006, 11:15:07
To nie ma znaczenia. phpMyAdmin zapewne informuje bazę, że pracuje w kodowaniu utf-8 i wtedy każdy ciąg znaków wychodzący z bazy czy przychodzący do bazy jest odpowiednio konwertowany do domyślnego kodowania w bazie czy danej tabeli. Czy w swoim skrypcie php informujesz bazę w jakim kodowaniu pracujesz?
Spróbuj przed jakimkolwiek zapytaniem wysłać do bazy:
SET NAMES utf8
Wtedy baza zacznie Ci przesyłać dane w utf-8. Wtedy pewnie już nie będziesz miał problemów z plikiem xml i we flash'u zacznie wszystko grać ale jak spróbujesz dane wyświetlić poprzez foreach zobaczysz na stronie którą przedstawiasz jako stronę w kodowaniu iso-8859-2 krzaki

Sam fakt, że znaki wypluwane z php na stronę w iso-8859-2 wyświetlane są prawidłowo, świadczy o tym, że operujesz na ciągach znaków zapisanych w iso-8859-2. Pamiętaj, że php operuje po prostu na binarnych ciągach znaków, nie dba i nie sprawdza w jakim one są kodowaniu, wszystko bierze i wypluwa jak jest.
Maslav
8.12.2006, 13:30:24
Hej.
Mam podobny problem.
Generuję xml z bazy danych. Wygenerowałem sobie w utf-8 i wszystko ok.
Ale okazało się że dane z xml'a wyświetlane są na stronie z kodowaniem ISO-8859-2 i tu mam problem.
Bo w momencie w którym tworzę $dom->createElement i przekazuje do metody znaki ISO powoduje to zatrzymanie skryptu.
plz help
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.