PHP DOMDocument :: save () сохраняет как ASCII вместо UTF-8

Я использую DOMDocument и SimpleXMLElement для создания форматированного XML-файла. Пока все это работает, результирующий файл сохраняется как ASCII, а не как UTF-8. Я не могу найти ответ о том, как это изменить.

XML создается так:

  $XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9"; $rootNode = new \SimpleXMLElement("<?xml version='1.0' encoding='UTF-8'?><urlset></urlset>"); $rootNode->addAttribute('xmlns', $XMLNS); $url = $rootNode->addChild('url'); $url->addChild('loc', "Somewhere over the rainbow"); //Turn it into an indented file needs a DOMDocument... $dom = dom_import_simplexml($rootNode)->ownerDocument; $dom->formatOutput = true; $path = "C:\\temp"; // This saves an ASCII file $dom->save($path.'/sitemap.xml'); 

Полученный XML выглядит так (как и должно быть):

 <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>Somewhere over the rainbow</loc> </url> </urlset> 

К сожалению, файл кодируется ASCII, а не UTF-8.

Как это исправить?

Изменить: не используйте блокнот ++ для проверки кодировки

Теперь мне нужно работать, благодаря принятому ответу ниже. Есть одна заметка: я использовал Notepad ++, чтобы открыть файл и проверить кодировку. Однако, когда я повторно создал файл, Notepad ++ обновил свою вкладку и по какой-то причине укажет ANSI в качестве кодировки. Закрытие и повторное открытие того же файла в Notepad ++ снова означало бы UTF-8. Это вызвало у меня путаницу.

Я думаю, здесь есть несколько вещей. Для одного вам нужно:

 $dom->encoding = 'utf-8'; 

Но также, я думаю, мы должны попытаться создать DOMDocument вручную, указав правильную кодировку. Так:

 <?php $XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9"; $rootNode = new \SimpleXMLElement("<?xml version='1.0' encoding='UTF-8'?><urlset></urlset>"); $rootNode->addAttribute('xmlns', $XMLNS); $url = $rootNode->addChild('url'); $url->addChild('loc', "Somewhere over the rainbow"); // Turn it into an indented file needs a DOMDocument... $domSxe = dom_import_simplexml($rootNode)->ownerDocument; // Set DOM encoding to UTF-8. $domSxe->encoding = 'UTF-8'; $dom = new DOMDocument('1.0', 'UTF-8'); $domSxe = $dom->importNode($domSxe, true); $domSxe = $dom->appendChild($domSxe); $path = "C:\\temp"; $dom->formatOutput = true; $dom->save($path.'/sitemap.xml'); 

Также убедитесь, что любые элементы или CData, которые вы добавляете, на самом деле являются UTF-8 (см. utf8_encode() ).

Используя приведенный выше пример, это работает для меня:

 php > var_dump($utf8); string(11) "ᙀȾᎵ⁸" php > $XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9"; php > $rootNode = new \SimpleXMLElement("<?xml version='1.0' encoding='UTF-8'?><urlset></urlset>"); php > $rootNode->addAttribute('xmlns', $XMLNS); php > $url = $rootNode->addChild('url'); php > $url->addChild('loc', "Somewhere over the rainbow $utf8"); php > $domSxe = dom_import_simplexml($rootNode); php > $domSxe->encoding = 'UTF-8'; php > $dom = new DOMDocument('1.0', 'UTF-8'); php > $domSxe = $dom->importNode($domSxe, true); php > $domSxe = $dom->appendChild($domSxe); php > $dom->save('./sitemap.xml'); $ cat ./sitemap.xml <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>Somewhere over the rainbow ᙀȾᎵ⁸</loc></url></urlset> 

Ваши данные не должны быть в UTF-8. Вы можете преобразовать его так:

 utf8_encode($yourData); 

Или, может быть:

 iconv('ISO-8859-1', 'UTF-8', $yourData)