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>
>Ü
</wurzel>
EOF;
echo $xml;
$doc=new DOMDocument();
$doc->loadXML($xml);
echo $doc->documentElement->nodeValue;
echo $doc->saveXML();
?>
ergibt:
<?xml version="1.0"?>
<wurzel>
>Ü
</wurzel>
Ü
<?xml version="1.0"?>
<wurzel>
>Ü
</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>
>Ü
</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>
>Ü
</wurzel>
Ü
<?xml version="1.0" encoding="UTF-8"?>
<wurzel>
>Ü
</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>
>Ü
</wurzel>
EOF;
echo $xml;
$doc=new DOMDocument();
$doc->loadXML($xml);
echo $doc->documentElement->nodeValue;
echo $doc->saveXML();
?>
ergibt:
<?xml version="1.0" ?>
<wurzel>
>Ü
</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>
>Ü
</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>
>Ü
</wurzel>
Ü
<?xml version="1.0" encoding="ISO-8859-1"?>
<wurzel>
>Ü
</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>
>Ü
</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>
>Ü
</wurzel>
Ü
<?xml version="1.0" encoding="ISO-8859-1"?>
<wurzel>
>Ü
</wurzel>
viele Grüße
Axel