PHP DOMDocument :: save () salva como ASCII em vez de UTF-8

Estou usando DOMDocument e SimpleXMLElement para criar um arquivo XML formatado. Enquanto isso tudo funciona, o arquivo resultante é salvo como ASCII, não como UTF-8. Não consigo encontrar uma resposta sobre como mudar isso.

O XML é criado assim:

  $XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9"; $rootNode = new \SimpleXMLElement(""); $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'); 

O XML resultante parece assim (que é como deveria ser, eu acho):

    Somewhere over the rainbow   

Infelizmente, o arquivo está codificado ASCII e não o UTF-8.

Como faço para corrigir isso?

Editar: Não use notepad ++ para verificar a codificação

Eu tenho que trabalhar agora, graças à resposta aceita abaixo. Há uma nota: usei o Notepad ++ para abrir o arquivo e verificar a codificação. No entanto, quando eu re-gerou o arquivo, o Notepad ++ atualizaria sua guia e, por algum motivo, indicaria ANSI como a codificação. O fechamento e a reabertura do mesmo arquivo no Notepad ++ indicariam novamente o UTF-8 novamente. Isso me causou uma grande quantidade de confusão.

Eu acho que há algumas coisas acontecendo aqui. Por um lado, você precisa:

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

Mas também, acho que devemos tentar criar o DOMDocument especificando manualmente a codificação apropriada. Assim:

 "); $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'); 

Certifique-se também de que qualquer elemento ou CData que você está adicionando é realmente UTF-8 (veja utf8_encode() ).

Usando o exemplo acima, isso funciona para mim:

 php > var_dump($utf8); string(11) "ᙀȾᎵ⁸" php > $XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9"; php > $rootNode = new \SimpleXMLElement(""); 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  Somewhere over the rainbow ᙀȾᎵ⁸ 

Os seus dados não devem estar na UTF-8. Você pode convertê-lo assim:

 utf8_encode($yourData); 

Ou talvez:

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