PDA

View Full Version : [PHP e SAX] Problema parsing


DoubleAJ
07-02-2006, 12:26
Sto sviluppando un guestbook in php che utilizza sax per parsare i dati memorizzati.
Ho notato che se all'interno dei file xml utilizzo caratteri accentati come à è ì ò ù, oppure £ e alcuni altri, mi restituisce "XML ERROR: Invalid character at line ..."
Come mai? come faccio a utilizzare questo tipo di caratteri?

Inoltre quando apro uno di questi file XML, se faccio una fread(), questa si blocca appena incontra un carattere "<".
E' un po' limitativo visto che devo leggere un file XML, che è pieno di questi caratteri..

C'è una soluzione?

Grazie

andbin
07-02-2006, 13:07
Sto sviluppando un guestbook in php che utilizza sax per parsare i dati memorizzati.
Ho notato che se all'interno dei file xml utilizzo caratteri accentati come à è ì ò ù, oppure £ e alcuni altri, mi restituisce "XML ERROR: Invalid character at line ..."
Come mai? come faccio a utilizzare questo tipo di caratteri?
Cosa hai messo nella dichiarazione dell'XML?? Se metti ad esempio:<?xml version="1.0" encoding="ISO-8859-1"?>non dovresti avere problemi.

Inoltre quando apro uno di questi file XML, se faccio una fread(), questa si blocca appena incontra un carattere "<".
E' un po' limitativo visto che devo leggere un file XML, che è pieno di questi caratteri..
Il codice per leggere (tramite parser) un file XML in PHP tipicamente è simile a questo:
$xml_parser = xml_parser_create ();

...imposta altre opzioni del parser...

$handle = @fopen ("nome_file.xml", "r");

if ($handle !== FALSE)
{
while ($data = fread ($handle, 4096))
if (!xml_parse ($xml_parser, $data, feof ($handle)))
die ("XML error");

fclose ($handle);
}

xml_parser_free ($xml_parser);

DoubleAJ
07-02-2006, 13:28
L'errore era causato dal fatto che avevo tralasciato questa parte di dichiarazione: encoding="ISO-8859-1"
Però ora al posto dell'errore mi visualizza i caratteri sbagliati:
per esempio se sul file scrivo: à è ì ò ù £ %
il parser mi legge: à è ì ò ù £ %
Forse c'è un altro tipo di encoding...

Passando all'altro argomento, il problema è qui:
$data = fread ($handle, 4096))
La fread() e anche la fgets(), se nel file è presente il carattere < , dentro $data inseriscono il contenuto del file fino alla prima occorrenza di < , dopodichè termina come se quel carattere lo riconoscesse come end of file.
Se per esempio nel file ho scritto: "ciao com<e stai"
dentro $data mi ritroverò questo "ciao com"

La cosa strana è che se uso file_get_contents() questo non succede...
Il fatto è che non volevo leggere sempre tutto il file, perchè col passare del tempo i messaggi diventano diverse migliaia, e parsare un file enorme ogni volta che si chiama una pagina diventa costoso, soprattutto in termini di tempo penso..

andbin
07-02-2006, 14:08
L'errore era causato dal fatto che avevo tralasciato questa parte di dichiarazione: encoding="ISO-8859-1"
Però ora al posto dell'errore mi visualizza i caratteri sbagliati:
per esempio se sul file scrivo: à è ì ò ù £ %
il parser mi legge: à è ì ò ù £ %
Uhm ..... a naso questi caratteri sanno di codifica UTF-8! Cioè mi sembra la codifica UTF-8 su 2 byte 110xxxxx 10xxxxxx.
Ma, tanto per sapere, la pagina HTML che crei quale charset ha??

Passando all'altro argomento, il problema è qui:
$data = fread ($handle, 4096))
La fread() e anche la fgets(), se nel file è presente il carattere < , dentro $data inseriscono il contenuto del file fino alla prima occorrenza di < , dopodichè termina come se quel carattere lo riconoscesse come end of file.
Se per esempio nel file ho scritto: "ciao com<e stai"
dentro $data mi ritroverò questo "ciao com"
Ti posso garantire (e non solo io) che la fread legge esattamente gli N caratteri richiesti (l'ultimo blocco letto dal file può essere più piccolo, questo è ovvio).
Come fai a dire che in $data ti ritrovi solo "ciao com"??? Hai fatto un echo $data; sulla pagina HTML??? Se così, certo che non ti trovi i <. Perché vengono visti come dei tag.
Comunque a te non dovrebbe interessare il blocco in $data. È la funzione xml_parse che si occupa di analizzare i dati e chiamare man mano le funzioni di callback definite!

DoubleAJ
07-02-2006, 14:31
Perfetto! Bisognava cambiare il charset della pagina html da iso-8859-1 a UTF-8...
Ora tenendo il file xml in ISO-8859-1 e la pagina html a UTF-8 mi visualizza bene..

Grazie!

Ora guardo bene anche per il problema della fread()...

andbin
07-02-2006, 15:09
Perfetto! Bisognava cambiare il charset della pagina html da iso-8859-1 a UTF-8...
Ora tenendo il file xml in ISO-8859-1 e la pagina html a UTF-8 mi visualizza bene..
Scusa, ma se prima nella tua pagina web vedevi i caratteri strani à è ì ò ù £ %, vuol dire che il file XML lo avevi (e penso lo hai tuttora) in UTF-8 e la pagina web la avevi in ISO-8859-1, dico bene?

DoubleAJ
07-02-2006, 15:28
Quando vedevo male i caratteri avevo sia la pagina html che il file xml in iso-8859-1.
Ora, cambiando solo la pagina html in UTF-8 vedo tutto bene...
Non chiedermi perchè, in effetti non ha molto senso...

andbin
07-02-2006, 15:46
Quando vedevo male i caratteri avevo sia la pagina html che il file xml in iso-8859-1.
Ora, cambiando solo la pagina html in UTF-8 vedo tutto bene...
Non chiedermi perchè, in effetti non ha molto senso...
Ah ... ecco, qualcosa non mi quadrava!
Vuol dire, molto probabilmente, che nonostante tu abbia specificato il charset iso-8859-1 nel file xml (nella prima riga), hai dentro il file dei caratteri codificati come UTF-8.
Non so come hai fatto il file xml, cioè con quale tool o editor.

DoubleAJ
07-02-2006, 15:53
...wordpad... :D
Però nel salvataggio ho lasciato la codifica ansi.

andbin
07-02-2006, 16:21
...wordpad... :D
Però nel salvataggio ho lasciato la codifica ansi.Uh ... molto strano!