Я использую 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)