ugrás a tartalomhoz

A PHP, latin2 charset és az XML esete

ada · 2007. Jún. 22. (P), 22.52
Sziasztok,

Egy ideje már görcsölök vele, de egyszerűen nem találok megoldást arra hogy egy olyan, egyszerű XML parsert írjak, ami kb. ugyanúgy megy PHP4 és PHP5 alatt is. Amit eddig alkottam (xml_parser függvényeket használva), viszonylag szépen megy PHP4 alatt, leszámítva hogy (számomra) véletlenszerű helyeken darabolja magát a tagokkal körülvett tartalmat, például:

rss\channel\item\link
Contents: http://prohardve
Contents: r.hu/c.php?mod=10
Contents: &
Contents: id=24038
end of link

(Most ahogy elnézem, túlnyomórészt & és ' körül vagdal.)

Ellenőriztem a forrás XML fájlt, és ott teljesen rendben, egyben van ez a link, a PHP4|5 pedig valamiért szétdarabolja. Ezt éppen meg lehet oldani könnyen, de nem vagyok benne biztos hogy ennek így kellene működnie.

A másik (fő) gond, hogy (csak) PHP5 alatt, bármit is csinálok, nem tudom rávenni hogy iso-8859-2 karakterkészletű kimenetet adjon. Se a hagyományos xml_parser fügvényekkel, se az XMLReader-el, se SimpleXML-el. Amint átállítom a headert, hogy UTF-8 tartalmat akarok megjeleníteni, egyből megjavul, legalábbis az ékezetes része.

Próbáltam iconv(), mb_convert_encoding() függvényeket is, sajnos egyik sem működött, és emiatt nem módosítanék sok sok oldalt UTF-8-ra, (adatbázisról nem is beszélve) ha nem muszáj.

Nagyra értékelném a segítséteket és a konstruktív hozzászólásokat az ügyben.

Előre is köszönöm!
 
1

minek?

Joó Ádám · 2007. Jún. 22. (P), 23.00
Mind PHP4 (DOMXML), mind PHP5 (DOM) alá létezik natív XML parser.
2

PHP5 DOM sem nyerő

ada · 2007. Jún. 22. (P), 23.22
Nemrég próbáltam már, most újra megnéztem, sehogyan sem akar iso-8859-2 kódolású kimenetet adni. A hozzászólások között találtam:

Note that these DOM functions expect (and presumably return) all their data in UTF-8 character encoding, regardless of what PHP's current encoding is. This means that text nodes, attribute values etc, should be in utf8.

This applies even if you're generating an XML document which is not ultimately in utf8.
3

iconv vagy mb_string

PraiSe · 2007. Jún. 23. (Szo), 01.01
iconv-vel, vagy az mb_string kiterjesztés segítségével konvertálhatod a szöveget, és akkor már nem lesz probléma az UTF-8-cal.
4

Bamba vagyok

ada · 2007. Jún. 23. (Szo), 02.11
Próbáltam iconv(), mb_convert_encoding() függvényeket is, sajnos egyik sem működött


Másodjára (és kicsit pihentebben) nekifutva már működik a dolog, rossz oldalról közelítettem meg, ugyanis magát a bemenő adatot konvertáltam, de ami átmegy az xml parseren az UTF-8-ba kerül.

Az első kérdésem még mindig él.

Ceriak: visszatérve az első kérdésedre, funkciókat tekintve egyelőre elég lesz az xml_parser-es megoldás, ez legalább verziófüggetlen, év vége után (megszűnik a PHP4 support dec. 31-től) meg hátha át tudnának sokan állni PHP5-re, legalábbis én reménykedek.
5

Épp fordított probléma

hunge · 2007. Júl. 11. (Sze), 12.46
Sziasztok!

Nekem is hasonló jellegű gondom támadt, csak éppenséggel fordított irányú. Amenyiben nem ez a megfelelő hely e komment céljára akkor kérem a moderátort hogy tegye át
A 8859-2 kódlapú XML dokumentumot szeretnék feldolgozni és az eredményt adatbázisba vinni. Szerencsétlenségemre a kapott XML séma és dukumentum telistele van magyar ékezetes betűket tartalmazó címkékkel.

Biztos vagyok benne hogy valmami PHP specifikus beállítás rosz mivel a (rendkívűl egyszerű) példafájl és kód amit az eredeti dokumentummal történt több óra kínlódást követően hoztam létre, bizonyosan jó.

$library = simplexml_load_file('tesztpelda.xml'); 
echo $library->Ételek->étel->tökfőzelék ; //nem fut le windoson linuxon igen
echo $library->Etelek->etel->tokfozelek ; //lefut mindkettőn
Ezt onnan tudom hogy van egy második ubuntu linux alapú gépem ahol apache 2.2.3 + php 5.2.2 került telepítésre, mindkettő csomagból. És ott lefut. Míg a win 2k3sp2 gépen apache 2.2.4 és php 5.2.3 található exe állományokból telepítve (a legfrissebb 22 megás a php.net/download szekcióról). Minden a gyári konfig szerint van kivéve a default_charset iso8859-1 átírtam iso8859-2 majd UTF-8ra de továbbra se jó. :-(

Hol foghatnék neki annak hogy kiederítsem, hogy mért nem akarja feldolgozni/bejárni a dokumentumot? És miért lehet az hogy az error_reporting = E_ALL opció ellenére nem kapok semmi hiba üzenetetüzenetet? A komment jelet természetesen mindkét esetben kivettem és az apache szolgáltatást újraindítottam, majd később a gépet is...

Ja és arra is gondoltam hogy mi lenne ha az XML fájl kódolást változtatnám meg értelemszerűen annak megfelelően ahogy a karakterkódolást állítgatom de eredmény nélkül.

Kérlek segítsetek megfejteni nekem hogy mi lehet a hiba oka. Köszönöm szépen.
6

display_errors

Marcell · 2007. Júl. 11. (Sze), 14.08
ini_set('display_errors', 1);
is van?
7

Megoldás!

hunge · 2007. Júl. 12. (Cs), 17.05
Köszönöm ez segített! Erről az opciórol még csak nem is tudtam mivel ezekszerint a (debian)csomagban terjesztett php változat alapból így van konfigurálva.

Így már sikerült bemérni a hibát. Annak oka nagyon egyszerű: a PHP simplexml kiterjesztése ezekszerint (windows alatt) file szinten nem tudja kezelni az ékezeteket. Ugyanis:

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "példaadat.xml" in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\teszt.php on line 10

Ám ha a filet átírom 'peldaadat.xml'-re akkor minden rendbevan. Köszönöm még1* a javaslatot.

Még csak annyi kérdésem volna, hogy szerintetek ez egy hiba és jelenteni kellene a fejlesztőknek vagy a "normál" működés része hogy nem kezeli az ékezetet?