Hei!
Pikkupulma. Eräässä xml-tiedostossa pikku ä-kirjain on muodossa ä. PHP5 katkaisee merkkijonon tuosta kohtaa ja tulostaa arrayn arvoon tiedon tuosta Ä-kirjaimesta alkaen. Mistä moinen johtuu? Miten saan koko tekstin arrayn arvoon?
Ps. Oikeastaan se ei ole Ä-kirjain vaan merkki 0195.
sen XML-tiedoston merkistökoodaus on UTF-8, mutta luet sitä jonaki muuna (esim. ISO-8859-1:nä eli fi-latin1:nä)
Avaa XML-tiedostos tekstieditoriin ja muuta sen merkistökoodausta, ni saat todennäkösesti toimimaan paremmin.
Kyseessä on ulkoinen rss-syöte, jonka tulostan php:n xml_parse funktioilla (start_tag, cdata ja end_tags) arrayhyn.
Pitää kokeilla lukea se muistiin, muuttaa ja vasta sitten syöttää xml_parse - funktiolle. Onko tuon muuttamiseen muuta kuin str_replace-jutut? Merkistökoodauksen muuttaminen jollain funktiolla?
Kuinkahan sen saisi tuolla onnistumaan?
$data = xml_parse($xml_parser,utf8_decode(file_get_contents($file)));
Tämä ilmoittaa arrayna tulostuksessa seuraavaa:
XML error: Invalid character at line 7
Tuo on ensimmäinen rivi xml-tiedostossa, jossa nuo mainitut merkinnät on. Kun tutkin tiedostoa file_get_contents funktiolla, utf8-koodausmerkit näkyy. Kun luen sen file-funktiolla, ne näkyy ä ja ö-kirjaimina jne. Tulostettaessa sitten html-muodossa katkaisee edelleen merkkijonon samasta kohtaa.
Ps. Testi:
$fp=file_get_contents($file); echo htmlspecialchars(utf8_decode($fp))."<br>"; // Tulostaa ä -merkin kohdalla ?
Myös seuraava muuttaa tuon utf8 merkin kysymysmerkiksi:
$fp=file_get_contents($file); $fpw=htmlspecialchars($fp); $fpw=str_replace("ä","ä",$fpw); echo $fpw;
Onko tätä mahdollista säätää PHP:n asetuksista?
PS. Nyt tämä str_replace tulostaa oikein. xml_parse-funktiolle syötettynä kuitenkin antaa tuon virheilmoituksen.
PHP4:ssä ei ollut ongelmia tämän saman tiedoston suhteen, siinä kaikki tieto tulostui arrayn arvoon.
Tämä on nyt tässä vaiheessa
$datat=file_get_contents($file); $datat=str_replace("UTF-8","ISO-8859-1",$datat); $data = xml_parse($xml_parser,$datat);
Tämän ansiosta ei herjaa virheellistä xml-tiedostoa. Edelleen on sama ongelma. UTF-8 merkit katkaisee merkkijonon. Merkit näkyy nyt oikein ä- ja ö-kirjaimina. Sekä utf8decode että str_replace muuttavat ne kysymysmerkiksi. Ja senkin jälkeen merkkijono pysyy katkaistuna.
Sama ongelma on myös xml-tiedostoissa, jotka jo valmiiksi ovat ISO-8859-1 tyyppiä. Merkkijono katkeaa ensimmäisen ä- kirjaimen kohdalla.
En keksi tähän muuta, kuin todeta, että syynä on lähes varmasti jokin PHP 5.2:n ominaisuus noissa xml-funktiossa, miten se niitä tulkitsee.
Mutta ei hätää. Mureakuhasta löytyi PHP :lle tehty luokka, joka hoitaa homman paremmin kuin nuo php.netin esimerkit.
Oletko muuten kokeillut SimpleXML-kirjastoa? Todella mainio apuväline XML:n käpistelyyn, suosittelen!
Olga kirjoitti:
Oletko muuten kokeillut SimpleXML-kirjastoa? Todella mainio apuväline XML:n käpistelyyn, suosittelen!
Kiitos! Nuo on kans oikein hyviä!
Aihe on jo aika vanha, joten et voi enää vastata siihen.