错误:“输入不是正确的 UTF-8,表示编码!”使用 PHP 的 simplexml_load_string

Posted

技术标签:

【中文标题】错误:“输入不是正确的 UTF-8,表示编码!”使用 PHP 的 simplexml_load_string【英文标题】:Error: "Input is not proper UTF-8, indicate encoding !" using PHP's simplexml_load_string 【发布时间】:2011-01-31 05:53:29 【问题描述】:

我收到了错误:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

尝试使用来自第 3 方来源的 simplexml_load_string 处理 XML 响应时。原始 XML 响应确实声明了内容类型:

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

然而,XML 似乎并不是真正的 UTF-8。 XML 内容的语言是西班牙语,并且在 XML 中包含诸如 Dublín 之类的词。

我无法让第 3 方整理他们的 XML。

如何预处理 XML 并修复编码不兼容问题?

有没有办法检测 XML 文件的正确编码?

【问题讨论】:

【参考方案1】:

Erik 的提议解决了我所面临的问题 https://***.com/a/4575802/14934277 实际上,这是了解您的数据是否可以打印的唯一方法。

这里有一些对任何人都可能有用的代码:

$product_desc = ..;
//Filter your $product_desc here. Remove tags, strip, do all you would do to print XML
try(new SimpleXMLElement('<sth><![CDATA['.$product_desc.']]></sth>'))->asXML();
catch(Exception $exc) $product_desc = '';; //Don't print trash

注意那部分。

<![CDATA[]]>

当您尝试从中创建 XML 时,请务必将其传递给浏览器将看到的最终产品,即使用 CDATA 包装您的字段

【讨论】:

【参考方案2】:

如果您确定您的 xml 以 UTF-8 编码但包含错误字符,您可以使用此功能更正它们:

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);

【讨论】:

【参考方案3】:

我们最近遇到了类似的问题,但找不到任何明显的原因。原来我们的字符串中有一个控制字符,但是当我们将该字符串输出到浏览器时,该字符是不可见的,除非我们将文本复制到 IDE 中。 p>

感谢this post,我们设法解决了我们的问题:

preg_replace('/[\x00-\x1F\x7F]/', '', $input);

【讨论】:

【参考方案4】:

经过几次尝试,我发现 htmlentities 功能有效。

$value = htmlentities($value)

【讨论】:

【参考方案5】:

我刚遇到这个问题。原来 XML 文件(不是内容)不是用 utf-8 编码的,而是用 ISO-8859-1 编码的。您可以在 Mac 上使用file -I xml_filename 进行检查。

我用Sublime把文件编码改成utf-8,lxml导入没问题。

【讨论】:

【参考方案6】:

在使用教义生成映射文件时,我遇到了同样的问题。我通过删除数据库中某些字段的所有 cmets 来修复它。

【讨论】:

【参考方案7】:

您可以简单地将这行代码放在 mysql_connect 语句之后,而不是使用 javascript

mysql_set_charset('utf8',$connection);

干杯。

【讨论】:

【参考方案8】:

如果您下载 XML 文件并例如在 Notepad++ 中打开它,您会看到编码设置为 UTF8 以外的其他内容 - 我自己制作的 xml 也有同样的问题,这只是编辑器中的编码:)

String &lt;?xml version="1.0" encoding="UTF-8"?&gt; 不设置文档的编码,它只是验证器或其他资源的信息。

【讨论】:

【参考方案9】:

我解决了这个问题

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);

【讨论】:

也为我工作,在我的情况下,XML 没有声明编码并且来自那些“企业”系统之一,所以无论如何都有奇怪的编码 我在使用 DOMDocument->load() 时遇到了同样的问题,这个解决方案工作正常,只需要在 file_get_contents 的结果上使用 ->loadXML 对我也有用!我正在使用 UTF-8 编码的 XML 文件中接收带有 ANSI 字符的文件。 为什么在内容之前使用 $,我有一个错误原因?【参考方案10】:

您的 0xED 0x6E 0x2C 0x20 字节对应于 ISO-8859-1 中的“ín”,因此看起来您的内容是 ISO-8859-1,而不是 UTF-8。告诉你的数据提供者并要求他们修复它,因为如果它对你不起作用,它可能对其他人也不起作用。

现在有几种方法可以解决这个问题,如果您无法正常加载 XML,则应该使用这些方法。其中之一是使用utf8_encode()。不利的一面是,如果该 XML 包含有效的 UTF-8 和一些 ISO-8859-1,那么结果将包含 mojibake。或者您可以尝试使用 iconv() 或 mbstring 将字符串从 UTF-8 转换为 UTF-8,并希望他们会为您修复它。 (他们不会,但您至少可以忽略无效字符,以便加载您的 XML)

或者您可以走很长很长的路,自己验证/修复序列。这将花费您一段时间,具体取决于您对 UTF-8 的熟悉程度。也许那里有图书馆可以做到这一点,虽然我不知道。

无论哪种方式,请通知您的数据提供商他们正在发送无效数据,以便他们进行修复。


这是部分修复。它肯定不会解决所有问题,但会解决一些问题。希望足以让您度过难关,直到您的提供商修复他们的东西。

function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)

    return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]2,)#', 'utf8_encode_callback', $str);


function utf8_encode_callback($m)

    return utf8_encode($m[0]);

【讨论】:

这很有帮助。我能够通过使用 utf8_encode() 来修复 XML。你能告诉我你是如何破译字符串0xED 0x6E 0x2C 0x20的编码的吗? ISO-8859-1 在西方世界被广泛使用。如果不是 UTF-8,通常是 ISO-8859-1。 (或cp1252)至于每个字节的值,我只是查了一下char表。【参考方案11】:

您能否在 Firefox 中打开第 3 方 XML 源并查看它自动检测到的编码内容?也许他们正在使用普通的旧 ISO-8859-1、UTF-16 或其他东西。

但是,如果他们将其声明为 UTF-8,并提供其他内容,那么他​​们的提要显然已损坏。在这样一个损坏的提要上工作对我来说感觉很糟糕(尽管有时是不可避免的,我知道)。

如果是“UTF-8 与 ISO-8859-1”这样的简单案例,您也可以使用mb_detect_encoding() 试试运气。

【讨论】:

mb_detect_encoding() 表示内容是 UTF-8,但如果它是有效的 UTF-8,XML 解析器会抱怨它吗? @Camsoft 奇怪。你能用火狐试试吗?你能把它归结为造成问题的角色吗?您是否可以将 URL 发布到 XML 提要?

以上是关于错误:“输入不是正确的 UTF-8,表示编码!”使用 PHP 的 simplexml_load_string的主要内容,如果未能解决你的问题,请参考以下文章

AOSP 使构建错误

使订阅超出范围错误

错误无法使 UICollectionElementKindCell 类型的视图出列

coredata错误使tableView无法显示(NSFetchedResultsController)

如何使 cppcheck 在错误时停止

遇到错误时如何使批处理文件终止?