Как загрузить XML, если PHP не может указать правильную кодировку?

Я пытаюсь загрузить источник XML из удаленного места, поэтому у меня нет контроля над форматированием. К сожалению, файл XML, который я пытаюсь загрузить, не имеет кодировки:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <NODE> </NODE> </ROOT>

При попытке что-то вроде:

$doc = new DOMDocument( );
$doc->load(URI);

Я получил:

Input is not proper UTF-8, indicate encoding ! Bytes: 0xA3 0x38 0x2C 0x38

Я искал способы подавить это, но не повезло. Как мне загрузить это, чтобы я мог использовать его с DOMDocument?


person Community    schedule 30.08.2009    source источник


Ответы (4)


Вам нужно преобразовать документ в UTF-8, проще всего использовать utf8_encode().

Пример DOM-документа:

$doc = new DOMDocument();
$content = utf8_encode(file_get_contents($url));
$doc->loadXML($content);

Пример SimpleXML:

$xmlInput = simplexml_load_string(utf8_encode(file_get_contents($url_or_file)));

Если вы не знаете текущую кодировку, используйте mb_detect_encoding(), например:

$content = utf8_encode(file_get_contents($url_or_file));
$encoding = mb_detect_encoding($content);
$doc = new DOMdocument();
$res = $doc->loadXML("<?xml encoding='$encoding'>" . $content);

Примечания:

  • Если кодировка не может быть обнаружена (функция вернет FALSE), вы можете попытаться принудительно использовать кодировку с помощью utf8_encode().
  • Если вместо этого вы загружаете html-код через $doc->loadHTML, вы все равно можете использовать заголовок XML.

Если вы знаете кодировку, используйте iconv() для ее преобразования:

$xml = iconv('ISO-8859-1' ,'UTF-8', $xmlInput)
person kenorb    schedule 19.03.2015

Вы можете отредактировать документ («предварительно обработать»), чтобы указать кодировку, которую он доставляет, при добавлении объявления XML. Что это такое, вы, конечно, должны выяснить сами. Затем объект DOM должен проанализировать его.

Пример объявления XML:

<?xml version="1.0" encoding="UTF-8" ?>
person Rushyo    schedule 30.08.2009
comment
Байты, на которые жалуются, указывают на то, что это ISO-8859-1, а не UTF-8. В частности, 0xA3 — это символ валюты GBP (знак фунта стерлингов). - person Dominic Mitchell; 30.08.2009
comment
Очевидно, это была не UTF-8, иначе это не было бы проблемой. Я имею в виду ключевое слово «пример». к вашему сведению. Эти коды также не выводят автоматически ISO-8859-1. - person Rushyo; 31.08.2009

Вместо этого вы можете попробовать использовать класс XMLReader. XMLReader разработан специально для XML и имеет варианты используемой кодировки (включая 'null' для отсутствия).

person Steven Surowiec    schedule 30.08.2009

Я столкнулся с похожей ситуацией. Я получил файл XML, который должен был быть закодирован в UTF-8, но он содержал некоторые неверные символы ISO.

Я написал следующий код для кодирования плохих символов в UTF-8.

<?php

# The XML file with bad characters
$filename = "sample_xml_file.xml";

# Read file contents to a variable
$contents = file_get_contents($filename);

# Find the bad characters
preg_match_all('/[^(\x20-\x7F)]*/', $contents, $badchars);

# Process bad characters if some were found
if(isset($badchars[0]))
{
        # Narrow down the results to uniques only
        $badchars[0] = array_unique($badchars[0]);

        # Replace the bad characters with their UTF8 equivalents
        foreach($badchars[0] as $badchar)
        {
                $contents = preg_replace("/".$badchar."/", utf8_encode($badchar), $contents);
        }
}

# Write the fixed contents back to the file
file_put_contents($filename, $contents);

# Cleanup
unset($contents);

# Now the bad characters have been encoded to UTF8
# It will now load file with DOMDocument
$dom = new DOMDocument();
$dom->load($filename);

?>

Я разместил более подробную информацию о решении по адресу: http://dev.strategystar.net/2012/01/convert-bad-characters-to-utf-8-in-an-xml-file-with-php/

person JV-    schedule 12.01.2012