Axel Richter: XML PHP Entities Umlaute echo save

Beitrag lesen

Hallo,

hier die Aufklärung des encoding-Chaos (musste mir erst PHP5 installieren):

Der folgende PHP-Quellcode, gespeichert unter encoding UTF-8 (ohne BOM)

  
<?php  
header('Content-Type:text/plain; charset=UTF-8');  
 $xml=<<<EOF  
<?xml version="1.0"?>  
<wurzel>  
&gt;Ü  
</wurzel>  
EOF;  
echo $xml;  
$doc=new DOMDocument();  
$doc->loadXML($xml);  
echo $doc->documentElement->nodeValue;  
echo $doc->saveXML();  
?>  

ergibt:
<?xml version="1.0"?>
<wurzel>
&gt;Ü
</wurzel>

Ü

<?xml version="1.0"?>
<wurzel>
&gt;&#xDC;
</wurzel>

PHP nutzt vorsichtshalber numerische Zeichenreferenzen, weil das XML keine klare encoding-Angabe hat. Darauf, dass UTF-8 Standard ist, verlassen sich die PHP-DOM-Programmierer offensichtlich nicht.
Beweis: Der leicht abgeänderte Code, wieder gespeichert unter encoding UTF-8 (ohne BOM)

  
<?php  
header('Content-Type:text/plain; charset=UTF-8');  
 $xml=<<<EOF  
<?xml version="1.0" encoding="UTF-8"?>  
<wurzel>  
&gt;Ü  
</wurzel>  
EOF;  
echo $xml;  
$doc=new DOMDocument();  
$doc->loadXML($xml);  
echo $doc->documentElement->nodeValue;  
echo $doc->saveXML();  
?>  

ergibt:
<?xml version="1.0" encoding="UTF-8"?>
<wurzel>
&gt;Ü
</wurzel>

Ü

<?xml version="1.0" encoding="UTF-8"?>
<wurzel>
&gt;Ü
</wurzel>

Mit ISO-8859-1 encoding (auch der PHP-Quellcode ist jeweils ISO-encodiert) sieht das Ganze so aus:

  
<?php  
header('Content-Type:text/plain; charset=ISO-8859-1');  
 $xml=<<<EOF  
<?xml version="1.0" ?>  
<wurzel>  
&gt;Ü  
</wurzel>  
EOF;  
echo $xml;  
$doc=new DOMDocument();  
$doc->loadXML($xml);  
echo $doc->documentElement->nodeValue;  
echo $doc->saveXML();  
?>  

ergibt:
<?xml version="1.0" ?>
<wurzel>
&gt;Ü
</wurzel><br />
<b>Warning</b>:  DOMDocument::loadXML() [<a href='function.DOMDocument-loadXML'>function.DOMDocument-loadXML</a>]: Input is not proper UTF-8, indicate encoding !
Bytes: 0xDC 0x0D 0x0A 0x3C in Entity, line: 3 in <b>D:\www\docs\test2.php</b> on line <b>11</b><br />
<?xml version="1.0"?>

Klar, das Byte 0xDC ist kein UTF-8. UTF-8 ist aber Standard, wenn kein encoding angegeben wurde.

Mit:

  
<?php  
header('Content-Type:text/plain; charset=ISO-8859-1');  
 $xml=<<<EOF  
<?xml version="1.0" encoding="ISO-8859-1"?>  
<wurzel>  
&gt;Ü  
</wurzel>  
EOF;  
echo $xml;  
$doc=new DOMDocument();  
$doc->loadXML($xml);  
echo $doc->documentElement->nodeValue;  
echo $doc->saveXML();  
?>  

ergibt sich:
<?xml version="1.0" encoding="ISO-8859-1"?>
<wurzel>
&gt;Ü
</wurzel>

Ü

<?xml version="1.0" encoding="ISO-8859-1"?>
<wurzel>
&gt;Ü
</wurzel>

Meine Vermutung, dass [DOMDocument]->documentElement->nodeValue grundsätzlich UTF-8 zurückliefert, bestätigt sich.

Mit:

  
<?php  
header('Content-Type:text/plain; charset=ISO-8859-1');  
 $xml=<<<EOF  
<?xml version="1.0" encoding="ISO-8859-1"?>  
<wurzel>  
&gt;Ü  
</wurzel>  
EOF;  
echo $xml;  
$doc=new DOMDocument();  
$doc->loadXML($xml);  
echo utf8_decode($doc->documentElement->nodeValue);  
echo $doc->saveXML();  
?>  

ergibt sich:
<?xml version="1.0" encoding="ISO-8859-1"?>
<wurzel>
&gt;Ü
</wurzel>

Ü

<?xml version="1.0" encoding="ISO-8859-1"?>
<wurzel>
&gt;Ü
</wurzel>

viele Grüße

Axel