[PHP] probleem met omzetten XML naar HTML

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ik ben een soort van CMS aan het maken waarin bepaalde teksten als XML worden opgeslagen. Deze xml wordt in een mediumtext-veld opgeslagen in MySQL.

Na het opslaan van de tekst in de db ziet deze er zo uit:
code:
1
2
<?xml version="1.0" encoding="UTF-8"?>
<content><paragraph>één, twee, drie test!</paragraph></content>


Nu wil ik deze tekst tonen binnen een webpagina en heb ik een xsl-stylesheet gemaakt om er weer nette html van te maken. Dit werkt opzicht goed alleen worden de speciale karakters zoals in mijn voorbeeld 'éé' niet juist weergegeven. Ik verwacht dat ie er 'éé' van maakt maar dat gebeurd dus niet.

Een stuk van mijn xsl-bestand:
code:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" />

<xsl:template match="paragraph">
  <p><xsl:apply-templates/></p>
</xsl:template>

..knip..


Ik ben het spoor even kwijt. Mijn data wordt als UTF-8 opgeslagen in de database. Hoe krijg ik dit nu weer omgezet naar correcte html-entities?

Als ik de xml converteer naar html met de stylesheet worden deze op de pagina nog wel getoond (al zijn het dan geen html-entities) maar als ik deze tekst probeer in te lezen in een WYSIWYG editor zoals TinyMCE dan zie ik dit soort karakters: "ééé"

Kan iemand me vertellen hoe ik dit oplos? Ik ben al aan de slag geweest met doctypes/encodings/CDATA/etc.. maar tot zover lukt het niet.

[UPDATE]
Of moet ik de htmlentities in de xml zien te krijgen?

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Dus op de pagina waar je de content laat zien, zie je wel gewoon éé ... maar in TinyMCE niet?

Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Bernardo schreef op woensdag 21 juli 2010 @ 16:01:
Dus op de pagina waar je de content laat zien, zie je wel gewoon éé ... maar in TinyMCE niet?
Ja, maar dat komt dus volgens mij omdat de éé niet als html-entities worden gebruikt. Als ik de html-source bekijk dan zie ik dus <p>éé</p>

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 17:23

Sebazzz

3dp

xantos schreef op woensdag 21 juli 2010 @ 16:02:
[...]


Ja, maar dat komt dus volgens mij omdat de éé niet als html-entities worden gebruikt. Als ik de html-source bekijk dan zie ik dus <p>éé</p>
HTML entities is slechts een manier om om je encodingprobleem heen te werken, geen oplossing.
De enige juiste link naar het juiste pad:
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Sebazzz schreef op woensdag 21 juli 2010 @ 16:11:
[...]

HTML entities is slechts een manier om om je encodingprobleem heen te werken, geen oplossing.
De enige juiste link naar het juiste pad:
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
Ja die link ken ik. Ik heb het verhaal nog eens gelezen maar er gaat geen belletje rinkelen hier. Ik zorg er overal voor dat het content-type UTF-8 is.

Het enige waar ik nu over twijfel of het probleem wordt veroorzaakt bij het opslaan (xml naar database) of bij het ophalen van de data.

De tekst wordt als volgt in het systeem verwerkt:
code:
1
2
3
4
5
6
7
8
invoer
- tekst typen in WYSIWYG editor 
- deze tekst omzetten naar xml middels een xsl
- opslaan in de database

ophalen
- uit de database halen en omzetten naar html middels een xsl
- tonen in WYSIWYG

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 17:23

Sebazzz

3dp

xantos schreef op woensdag 21 juli 2010 @ 16:25:
[...]


Ja die link ken ik. Ik heb het verhaal nog eens gelezen maar er gaat geen belletje rinkelen hier. Ik zorg er overal voor dat het content-type UTF-8 is.
Dat blijkt dan ja. Overal zomaar UTF-8 op plakken werkt niet. De encoding van al je media (invoerbestanden, database, uitvoer) moet gelijk zijn, óf je moet het converteren. Bijvoorbeeld, je database zal op latin-1 staan denk ik? Zorg er dan voor dat je voordat je strings erin stopt het geconverteerd is naar latin-1. Zorg er ook voor dat de encoding van SQL goed staat, in het geval van MySQL: http://dev.mysql.com/doc/...n/charset-connection.html

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Sebazzz schreef op woensdag 21 juli 2010 @ 16:31:
[...]

Dat blijkt dan ja. Overal zomaar UTF-8 op plakken werkt niet. De encoding van al je media (invoerbestanden, database, uitvoer) moet gelijk zijn, óf je moet het converteren. Bijvoorbeeld, je database zal op latin-1 staan denk ik? Zorg er dan voor dat je voordat je strings erin stopt het geconverteerd is naar latin-1. Zorg er ook voor dat de encoding van SQL goed staat, in het geval van MySQL: http://dev.mysql.com/doc/...n/charset-connection.html
Hi Sebazzz,

Ik gebruik een framework (Symfony). Database is UTF-8 en zo is mijn SQL encoding.
Het gaat dus alleen mis als ik converteer naar xml en weer terug. In alle andere 'normale' gevallen heb ik geen probleem.

Ik vraag me dan ook af of tekst die in de database staat correct is:

code:
1
2
<?xml version="1.0" encoding="UTF-8"?>
<content><paragraph>één, twee, drie test!</paragraph></content>


is dit correct of moet dit zijn:

code:
1
2
<?xml version="1.0" encoding="UTF-8"?>
<content><paragraph><![CDATA[&eacute;&eacute;n, twee, drie test!]]></paragraph></content>


Mijn tekst gaat door de volgende functie waarna het dus xml wordt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static function convertHTMLToXML($html)
  {
    
    if ($html)
    {      
      $xslDoc = new DOMDocument();
      $xslDoc->load("/xml/htmltoxml.xsl");      
      $htmlDoc = new DOMDocument();
      @$htmlDoc->loadHTML($html);
      
      $proc = new XSLTProcessor();
      $proc->importStylesheet($xslDoc);
      //die($proc->transformToXML($htmlDoc));
      return $proc->transformToXML($htmlDoc);
    }
    else
      return '';
  }

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
$dom = new DOMDocument;
$dom->encoding = 'UTF-8';

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

De eerste is gewoon correct, mits die 'é'-tekens ook daadwerkelijk UTF-8 encoded zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Janoz schreef op woensdag 21 juli 2010 @ 16:55:
De eerste is gewoon correct, mits die 'é'-tekens ook daadwerkelijk UTF-8 encoded zijn.
Ok, dat is mooi. :)

Dan blijf ik met deze vraag zitten... Waarom werkt mijn onderstaande xls-stylesheet niet en wordt de 'é' niet meer omgezet naar een html-entity?

code:
1
2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" />

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Omdat er helemaal geen noodzaak is om dat om te zetten. Die is er namelijk alleen voor < > en &

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Janoz schreef op woensdag 21 juli 2010 @ 17:07:
Omdat er helemaal geen noodzaak is om dat om te zetten. Die is er namelijk alleen voor < > en &
ohhwww.. :?

De 'é' wordt trouwens uiteindelijk 'é' in mijn WYSIWYG editor. De TinyMCE editor interpreteert dit dus blijkbaar als
code:
1
&Atilde;&copy;


Wat kan er dan mis zijn?

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Staat TinyMCE op UTF-8? En voordat je weer direct post, heb je dat gecontroleerd?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Wellicht interpreteert TinyMCE het gewoon verkeerd?

* Alex) zwaait naar MueR

[ Voor 26% gewijzigd door Alex) op 21-07-2010 17:15 ]

We are shaping the future


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
MueR schreef op woensdag 21 juli 2010 @ 17:13:
Staat TinyMCE op UTF-8? En voordat je weer direct post, heb je dat gecontroleerd?
Voor zover ik kan zien is er geen UTF-8 optie die ik kan aanzetten of wijzigen.
Alex) schreef op woensdag 21 juli 2010 @ 17:14:
Wellicht interpreteert TinyMCE het gewoon verkeerd?
Als ik de editor vul met content uit mijn xml-veld gaat het mis. Maar als ik de editor vul met gewone utf-8 content dan gaat het wel goed. Ik denk dat ik hierdoor de conclusie kan trekken dat het geen TinyMCE probleem is maar dat er toch iets mis is met de encoding van mijn gemaakte html.

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Heb je geprobeerd of je dit probleem met andere WYSIWYG-editors ook hebt, zoals FCKEditor?

We are shaping the future


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Heb je al uitgesloten dat het in die editor zit? Wat gebeurt er bijv. als je die content gewoon echo't?

Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ik ben inmiddels al een stapje verder en heb de editor uitgesloten. Het probleem doet zich namelijk ook voor bij de FCKeditor.

Wat ik gedaan heb is een:

code:
1
echo mb_detect_encoding($page->getComment());


op een veld dat wel werkt en

code:
1
echo mb_detect_encoding($page->getContentFromXml());


dat dus niet werkt.

De eerste geeft het type : ASCII en het tweede UTF-8. Dit verbaasde me enigzins (ik bedoel dat de eerste van het type ASCII was). Ik ben nu aan het bekijken waarom dit zo is.

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Ik denk dat je twee problemen hebt. Je source XML wordt dubbel geencodeerd en wellicht zou je de encoding uit de <xsl:output method="html" encoding="UTF-8" /> moeten halen (dus: <xsl:output method="html" />

Tweede is omzetten van entities in XSLT. Dat is een heel gedoe, maar http://www.xml.com/lpt/a/747 en http://www.dpawson.co.uk/xsl/sect2/nbsp.html zouden je verder kunnen helpen.

Sundown Circus


Acties:
  • 0 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 12-09 11:42

EnnaN

Toys in the attic

xantos schreef op woensdag 21 juli 2010 @ 17:11:
[...]


ohhwww.. :?

De 'é' wordt trouwens uiteindelijk 'é' in mijn WYSIWYG editor. De TinyMCE editor interpreteert dit dus blijkbaar als
code:
1
&Atilde;&copy;


Wat kan er dan mis zijn?
Misschien spuit11, maar ik zag hier nog niets over multibyte characters staan. ALs je een multibyte char niet als zodanig leest, dan krijg je dus het eerste stuk als aparte character (voor mijn gevoel altijd een A met een tilde, iig iets in die range ;) ), en het tweede stuk als apart character. Dat is er dus aan de hand. Je hebt een multibyte character (utf-8?) en hetgeen wat de weergave doet pakt het op als een oldscool character, en dus worden dat er 2.

sig


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
RedRose schreef op donderdag 22 juli 2010 @ 12:20:
Ik denk dat je twee problemen hebt. Je source XML wordt dubbel geencodeerd en wellicht zou je de encoding uit de <xsl:output method="html" encoding="UTF-8" /> moeten halen (dus: <xsl:output method="html" />

Tweede is omzetten van entities in XSLT. Dat is een heel gedoe, maar http://www.xml.com/lpt/a/747 en http://www.dpawson.co.uk/xsl/sect2/nbsp.html zouden je verder kunnen helpen.
ok, dat ga ik eens bekijken. Een van de twee links was ik al tegen gekomen.
EnnaN schreef op vrijdag 23 juli 2010 @ 09:07:
[...]


Misschien spuit11, maar ik zag hier nog niets over multibyte characters staan. ALs je een multibyte char niet als zodanig leest, dan krijg je dus het eerste stuk als aparte character (voor mijn gevoel altijd een A met een tilde, iig iets in die range ;) ), en het tweede stuk als apart character. Dat is er dus aan de hand. Je hebt een multibyte character (utf-8?) en hetgeen wat de weergave doet pakt het op als een oldscool character, en dus worden dat er 2.
Klikt wel aannemelijk wat je zegt. Ik ga het straks nog eens bekijken en begin even met een schone lij. Er zullen wel meerdere oplossingen zijn maar mij lijkt het het handigst als ik multibyte karakters kan omzetten naar html-entities zoals "é" naar
code:
1
&eacute;

Acties:
  • 0 Henk 'm!

Verwijderd

xantos schreef op vrijdag 23 juli 2010 @ 09:43:
[...]


ok, dat ga ik eens bekijken. Een van de twee links was ik al tegen gekomen.


[...]


Klikt wel aannemelijk wat je zegt. Ik ga het straks nog eens bekijken en begin even met een schone lij. Er zullen wel meerdere oplossingen zijn maar mij lijkt het het handigst als ik multibyte karakters kan omzetten naar html-entities zoals "é" naar
code:
1
&eacute;
Dat klinkt in mijn oren als een omweg, niet als een oplossing. Het is allemaal niet zo belachelijk moeilijk, zorg dat *overal* (en dan bedoel ik echt *overal*) UTF-8 wordt gebruikt en je hebt 0x problemen.

Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
RedRose schreef op donderdag 22 juli 2010 @ 12:20:
Ik denk dat je twee problemen hebt. Je source XML wordt dubbel geencodeerd en wellicht zou je de encoding uit de <xsl:output method="html" encoding="UTF-8" /> moeten halen (dus: <xsl:output method="html" />

Tweede is omzetten van entities in XSLT. Dat is een heel gedoe, maar http://www.xml.com/lpt/a/747 en http://www.dpawson.co.uk/xsl/sect2/nbsp.html zouden je verder kunnen helpen.
O+ schaam, schaam.. O+ Redline, jij zat er nog het dichtste bij. Er werd inderdaad dubbel geencodeerd, sterker nog de betreffende xml werd twee keer achter elkaar geparsed en door de xsl gehaald. Was een stukje code dat ik over het hoofd had gezien aangezien ik het probleem heel ergens anders zocht.

Anyway, bedankt voor jullie tips en suggesties!!
Pagina: 1