ugrás a tartalomhoz

DOMDocument karakterkódolás, saveHTML,saveXML

carstepPCE · 2011. Szep. 14. (Sze), 01.24
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:
  1. $d = htmlspecialchars_decode($articletext);  
  2.         $x = new DOMDocument();  
  3.         $x->loadHTML($d); //utf8_decode($d);  
  4.         $imgs = new DOMNodeList();  
  5.         $imgs = $x->getElementsByTagName('img');  
  6.         if($imgs->length>0){  
  7.             $l = $imgs->length;  
  8.             for($i=0;$i<$l;$i++){  
  9.                 $width = 0; $height = 0;  
  10.                 $item = $imgs->item($i);  
  11.                 $attrs = $item->attributes; //DOMNamedNodeMap  
  12.                 $name = $attrs->getNamedItem('src');  
  13.                 $w = $attrs->getNamedItem('width');  
  14.                 if($w!=NULL){  
  15.                     $width = $w->value; //DOMAttr  
  16.                 }  
  17.                 $h = $attrs->getNamedItem('height');  
  18.                 if($h!=NULL){  
  19.                     $height = $h->value;  
  20.                 }  
  21.                 $imgName = generateImgForArticle($name,$width,$height);  
  22.                 $name->nodeValue = $imgName;  
  23.             }  
  24.         }  
  25.         $article = preg_replace('/^<!DOCTYPE.+?>/'''str_replacearray('<html>''</html>''<body>''</body>'), array(''''''''), $x->saveHTML()));  
  26. //      $article = $x->saveXML($x->documentElement->childNodes->item(0)->childNodes->item(0));  
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.: &Atilde; 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
 
1

A következő kód nálam

Poetro · 2011. Szep. 14. (Sze), 02.22
A következő kód nálam tökéletesen működik:
  1. <?php  
  2. header('Content-type: text/plain; charset=utf-8');  
  3. $articletext = file_get_contents('http://weblabor.hu/forumok/temak/109931');  
  4. $d = htmlspecialchars_decode($articletext);  
  5. $x = new DOMDocument('1.0''utf-8');  
  6. $x->loadHTML($d); //utf8_decode($d);  
  7. $imgs = new DOMNodeList();  
  8. $imgs = $x->getElementsByTagName('img');  
  9. if($imgs->length>0){  
  10.     $l = $imgs->length;  
  11.     for($i=0;$i<$l;$i++){  
  12.         $width = 0; $height = 0;  
  13.         $item = $imgs->item($i);  
  14.         $attrs = $item->attributes; //DOMNamedNodeMap  
  15.         $name = $attrs->getNamedItem('src');  
  16.         $w = $attrs->getNamedItem('width');  
  17.         if($w!=NULL){  
  18.             $width = $w->value; //DOMAttr  
  19.         }  
  20.         $h = $attrs->getNamedItem('height');  
  21.         if($h!=NULL){  
  22.             $height = $h->value;  
  23.         }  
  24.     }  
  25. }  
  26. print($x->saveHTML());  
  27. ?>  
Nem lehet, hogy valahol máshol keletkezik a hiba a dokumentumban? Bár nem tudom, mit csinál a generateImgForArticle de lehet azt is érdemes lenne megnézni.
2

jo utra vezettel

carstepPCE · 2011. Szep. 14. (Sze), 15.49
a generateImgForArticle csak szimpla szoveg allit ossze a img nevenek.

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 :)