DOMDocument karakterkódolás, saveHTML,saveXML
Sziasztok,
van egy adatbázis táblám, amiben cikkek vannak mindenféle html formázással, képekkel etc-ra, ide az adatok a htmlspecialchars -sal elkódolva vannak utf8-ban eltárolva. Szerettem volna a képeken pár manipulációt végrehajtani a PHP DOM objektumainak a segítségével. Mindent megcsinált szépen, ahogy kell mindössze nem bírtam elmenteni a kimenetet úgy, hogy a hosszú ő,ű megmaradjon, vagy az ékezetek egyáltalán megjelenjenek.
A kérdéses php fájl UTF-8ban van kódolva, ami a függvényeket és az adatbáziskezelést is csinálja. Próbálkoztam a iconv_set_encoding gal, setlocale -lal, mb_convert_encodinggal, de nem sikerül sehogy sem megtartani az ő,ű ékezeteket.
kód lényeges része:ha $d értékét kiíratom simán, akkor rendesen megjelenik minden karakter és a semmilyen formában nincsenek elkódolva az ékezetek (web safe formára gondolok pl.: Ã stb.) az oldal forráskódja alapján.
Igazából, annyi féle kombinációt kipróbáltam már, hogy nem látom a fától az erdőt, és a segítségeteket kérem, hátha ti látjátok mit rontok el?
Üdv
■ van egy adatbázis táblám, amiben cikkek vannak mindenféle html formázással, képekkel etc-ra, ide az adatok a htmlspecialchars -sal elkódolva vannak utf8-ban eltárolva. Szerettem volna a képeken pár manipulációt végrehajtani a PHP DOM objektumainak a segítségével. Mindent megcsinált szépen, ahogy kell mindössze nem bírtam elmenteni a kimenetet úgy, hogy a hosszú ő,ű megmaradjon, vagy az ékezetek egyáltalán megjelenjenek.
A kérdéses php fájl UTF-8ban van kódolva, ami a függvényeket és az adatbáziskezelést is csinálja. Próbálkoztam a iconv_set_encoding gal, setlocale -lal, mb_convert_encodinggal, de nem sikerül sehogy sem megtartani az ő,ű ékezeteket.
kód lényeges része:
$d = htmlspecialchars_decode($articletext);
$x = new DOMDocument();
$x->loadHTML($d); //utf8_decode($d);
$imgs = new DOMNodeList();
$imgs = $x->getElementsByTagName('img');
if($imgs->length>0){
$l = $imgs->length;
for($i=0;$i<$l;$i++){
$width = 0; $height = 0;
$item = $imgs->item($i);
$attrs = $item->attributes; //DOMNamedNodeMap
$name = $attrs->getNamedItem('src');
$w = $attrs->getNamedItem('width');
if($w!=NULL){
$width = $w->value; //DOMAttr
}
$h = $attrs->getNamedItem('height');
if($h!=NULL){
$height = $h->value;
}
$imgName = generateImgForArticle($name,$width,$height);
$name->nodeValue = $imgName;
}
}
$article = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $x->saveHTML()));
// $article = $x->saveXML($x->documentElement->childNodes->item(0)->childNodes->item(0));
Igazából, annyi féle kombinációt kipróbáltam már, hogy nem látom a fától az erdőt, és a segítségeteket kérem, hátha ti látjátok mit rontok el?
Üdv
A következő kód nálam
generateImgForArticle
de lehet azt is érdemes lenne megnézni.jo utra vezettel
Viszont azzal, hogy te egy weboldalt hivtal be, bekerult egy content type deklaracio is a headben, es ez jelentette a megoldast. Ugyanis elkezdtem e tartalomra vonatkozo elemeket (doctype,content-type) egyesevel a hozzaadni az adatbazisbol jovo tartalomhoz, ami ugye csak HTML fragmenteket tartalmaz.
Tehat konkluziokent azt mondanam, hogy hiaba utf8 kodolas meg minden, ha csak html fragmenteket adsz meg a DOMDocumentnek, akkor nem fogja megfeleloen kezelni a ISO-8859-1 n kivuli karaktereket(bar ez egyenlore csak feltetelezes). Ezert a content type-t hozza kell adni valamilyen formaban. Nalam siman a tartalom ele kerult.
Utana viszont ki kell venni a plusz deklaracokat, esetleg saveXML hasznalni es a megfelelo Node-t megadva neki, hogy megkapd az eredeti tartalmat. Lehet par kreativ megoldasban gondolkodni.
ui.: termeszetesen utolag visszanezve a loadHTML commentjeit, a legelso mar errol szol :)