[PHP5]Dom functies: entities niet weer te geven.

Pagina: 1
Acties:

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Topicstarter
Hallo allemaal :) .

Ik zit met een probleem, waar ik nu ook na veel gezoek op Google en GoT niet uit kom. Ik ben bezig met een applicatie waarin de items / nodes aan de DOM binnen php worden toegevoegd, waarna deze als HTML uitgepoept worden.

Het probleem is nu echter dat ik de entities niet gerepresenteerd krijg, omdat de & binnen een entitie, zoals ", áltijd vervangen lijkt te worden door &, en aangezien de data dan verzonden is naar de browser kan ik er niks meer aan doen :) .

Ik begin mijn DOM netjes, naar ik hoop, op de volgende manier:
PHP:
1
2
3
4
5
6
7
8
9
10
header("Content-Type:text/html;charset=utf-8");

$implementation = new DOMImplementation();
$doctype = $implementation->createDocumentType("HTML", "4.01//EN", 
                                                    "http://www.w3.org/TR/html4/strict.dtd");       
$dom = $implementation->createDocument("", "", $doctype);

//appending

print $dom->saveHTML();


Als ik nu een text met bijvoorbeeld de "é" (é) wil weergeven wil dat niet lukken, wegens het voorgenoemde probleem. ($string is in de volgende voorbeelden é.)

Gewoon appenden, levert een soort van tab op:
PHP:
1
2
$text = $dom->createTextNode($string);
$dom->appendChild($text);


Met HTML entities krijg ik é:
PHP:
1
2
3
$string = htmlentities($string);
$text = $dom->createTextNode($string);
$dom->appendChild($text);


Met HTML entities waarin ik vermeld dat het UTF-8 geencodeerd is (zo zit het in de database) krijg ik weer een soort tab.
PHP:
1
2
3
$string = htmlentities($string, ENT_QUOTES, "UTF-8");
$text = $dom->createTextNode($string);
$dom->appendChild($text);


Ook normaliseren helpt niets:
PHP:
1
2
$dom->normalize;
print $dom->saveHTML();


Als iemand me zou kunnen helpen zou ik daar erg blij van worden O+ . Een inzicht in wat die rare tabs zijn, of waarom hij anders reageert als ik vermeld dat de encoding UTF-8 is zou ook erg van pas komen :) .

DM!


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Wat levert createEntityReference op?

Je zou overigens kunnen proberen een numeriek entity reference aan te maken en kijken of die wel werkt. Bijvoorbeeld é voor je é.

Verder lijkt het mij van belang te weten wat de target encoding van de dom tree is; i.e. welke encoding uiteindelijk bij de browser belandt.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Wat je in elk geval niet moet doen, is eerst htmlentities (of een soortgelijke functie) gebruiken, en het resultaat aan de createTextNode methode voeren. Dat is dubbel. Die Text node mag gewoon alle tekens bevatten, als het DOM object geserializet wordt (e.g. naar schijf weggeschreven, aan client aangeboden) wordt de boel vanzelf geëscapet.

Zie het verhaal van drm, je moet dit zoeken in het gebruiken van de juiste encoding, en ervoor zorgen dat ofwel PHP output genereert in de standaard encoding van de webserver, of dat PHP gewoon expliciet aangeeft in welke encoding de output is door bijvoorbeeld een Content-Type header mee te sturen met die character encoding.

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Topicstarter
quote: drm
]Verder lijkt het mij van belang te weten wat de target encoding van de dom tree is; i.e. welke encoding uiteindelijk bij de browser belandt.
Als ik een header meegeef met UTF-8, zoals ik in het voorbeeld doen, is het UTF-8. Als ik dat niet doe is het ISO-8859-1.
quote: drm
Je zou overigens kunnen proberen een numeriek entity reference aan te maken en kijken of die wel werkt. Bijvoorbeeld é voor je é.
Dan wordt de & nog steeds omgezet naar &, zodat ik in de source van de geoutputte page é krijg. Dat helpt dus niet, het zit 'em in die & :) .
quote: Cheatah
Zie het verhaal van drm, je moet dit zoeken in het gebruiken van de juiste encoding, en ervoor zorgen dat ofwel PHP output genereert in de standaard encoding van de webserver, of dat PHP gewoon expliciet aangeeft in welke encoding de output is door bijvoorbeeld een Content-Type header mee te sturen met die character encoding.
In het voorbeeld gaf ik ook een UTF-8 encoding mee, aangezien dat uit de dbase kwam. Maar is dat dan de juiste?
quote: Cheatah
Wat je in elk geval niet moet doen, is eerst htmlentities (of een soortgelijke functie) gebruiken, en het resultaat aan de createTextNode methode voeren. Dat is dubbel. Die Text node mag gewoon alle tekens bevatten, als het DOM object geserializet wordt (e.g. naar schijf weggeschreven, aan client aangeboden) wordt de boel vanzelf geëscapet.
Ok, dat is iniedergeval goed om te weten :) .
Wat levert createEntityReference op?
Dat werkt inderdaad wél, dankje! :) .

Dan ga ik nu even studeren op hoe ik een text, al dan niet met of zonder entities opgeslagen, met behulp van createEntityReference in de text kan voegen. Ik neem aan dat ik dan iets zal moeten doen met DOMCharacterData?

Maar hoe krijg ik nu een EntityReference (uit en) in een TextNode, of moet het dan zoiezo op een andere manier?

[ Voor 12% gewijzigd door JHS op 27-08-2005 11:51 ]

DM!


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ik had het volgende scriptje even gekopieerd om te kijken wat er bij jou nou precies gebeurd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
header("Content-Type:text/html;charset=utf-8");

$implementation = new DOMImplementation();
$doctype = $implementation->createDocumentType("HTML", "4.01//EN", 
                                                    "http://www.w3.org/TR/html4/strict.dtd");        
$dom = $implementation->createDocument("", "", $doctype);

$string = "é";
$text = $dom->createTextNode($string);
$dom->appendChild($text);

print $dom->saveHTML();
?>


Dit script leek wel in een soort van oneindige loop uit te komen, maar werkte prima wanneer ik van é een gewone e maakte. Toen ik vervolgens het scriptdocument zelf als UTF-8 geencodeerd opsloeg in m'n UltraEdit, werkte het prima met é. Misschien dat je hier wat aan hebt...

  • PipoDeClown
  • Registratie: September 2000
  • Niet online

PipoDeClown

Izze Zimpell

werkt hetvolgende wel goed?
PHP:
1
$string = utf8_encode('é');


(me noob hoor) ok ik bedoel dus encode, geen decode hehe

[ Voor 22% gewijzigd door PipoDeClown op 27-08-2005 21:29 ]

God weet alles, want hij is lid van de Mosad. To protect your freedom i will take that away from you. Mijn drankgebruik heeft ernstig te lijden onder mijn gezondheid.


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Topicstarter
Genoil: Dat werkt inderdaad wel. Maar als ik het met data uit een database doe, die er als utf-8 in zit, dan werkt het weer niet... Maargoed, dan zit het probleem iniedergeval ergens in de character encoding, dus ga ik daar verder op zoeken :) . Zie hieronder :+

PipoDeClown: Nee, dat werkt niet :) . Maar als ik utf8-encode over mijn database gegevens heenhaal, dan werkt het wél. Kennenlijk zit de data tóch niet als utf-8 in de dbase, of komt het er iig niet zo uit.

De pagina waarmee de data ín de dbase (mysql) gaat is utf-8, de uitleespagina ook, en de collatie is ook utf-8 (unicode). Als iemand nog een idee heeft waarom het hier misgaat zou ik dat geweldig vinden :) .

Iniedergeval allemaal bedankt O+ .

DM!


  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04-2025
JHS schreef op zaterdag 27 augustus 2005 @ 18:10:
De pagina waarmee de data ín de dbase (mysql) gaat is utf-8, de uitleespagina ook, en de collatie is ook utf-8 (unicode). Als iemand nog een idee heeft waarom het hier misgaat zou ik dat geweldig vinden :) .
Ik weet dat het een oud topic is, maar ik zat met hetzelfde probleem en heb nu de oplossing gevonden.

De database (in mijn geval MySQL) stuurt de gegevens ook met een bepaalde charset naar de client en als die niet overeenkomt met je data of de manier waarop je het wilt weergeven kan dit behoorlijk verkeerd gaan. In mijn geval moest ik in PHP vantevoren de characterset nog definiëren:
PHP:
1
2
$db = new mysqli(...);
$db->set_charset('UTF8');

Hopelijk heeft iemand er iets aan :)
Pagina: 1