Как загрузить 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 

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

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

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

 <?xml version="1.0" encoding="UTF-8" ?> 

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

Пример DOMdocument:

 $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) 

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

Я столкнулся с подобной ситуацией. Я получаю 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); ?> не <?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/