当PHP无法指示正确的编码时如何加载XML?

时间:2009-08-30 16:40:45

标签: php xml utf-8 character-encoding xml-parsing

我正在尝试从远程位置加载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一起使用?

4 个答案:

答案 0 :(得分:1)

您可以编辑文档('预处理')以指定在添加XML声明时传递的编码。那是什么,当然,你必须确定自己。然后DOM对象应该解析它。

示例XML声明:

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

答案 1 :(得分:1)

您已将文档转换为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()强制进行编码。
  • 如果您通过$doc->loadHTML重新加载html代码,您仍然可以使用XML标头。

如果您知道编码,请使用iconv()进行转换:

$xml = iconv('ISO-8859-1' ,'UTF-8', $xmlInput)

答案 2 :(得分:0)

您可以尝试使用XMLReader课程。 XMLReader是专为XML设计的,可以选择使用哪种编码(包括'null'表示无)。

答案 3 :(得分:-1)

我遇到了类似的情况。我得到的是一个应该是UTF-8编码的XML文件,但它包含了一些不好的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/