Encoding is hard in many cases. Today I ran into one, where we had to save UTF-8 data (from a Drupal website) into an XML document which requires ISO-8859-1 encoding.
We're using https://www.php.net/manual/de/class.domdocument.php for that, which seems to have some problems / flaws with such cases, as the following issues show:
- https://stackoverflow.com/questions/8218230/php-domdocument-loadhtml-no…
- https://stackoverflow.com/questions/55601886/xml-encoding-error-but-bot…
After trying conversion of the relevant data using utf8_decode and other ways like iconv and mb_convert_encoding I'm now finally using this (ugly) workaround which seems to give us the expected results.
Perhaps it also helps in your case, if it's similar:
<?php
$domtree = new DOMDocument('1.0', 'ISO-8859-1');
$domtree->createElement("example123");
// We do NOT use the DOMDocument definition here, instead build our own:
$xmlString = '<?xml version="1.0" encoding="ISO-8859-1"?>' . PHP_EOL . $domtree->saveXML($domtree->documentElement);
?>
All other possible solutions resulted in wrong encoding for me. I guess the reason is, that DOMDocument uses internal conversion magic...