错误:“输入不是正确的 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 <?xml version="1.0" encoding="UTF-8"?>
不设置文档的编码,它只是验证器或其他资源的信息。
【讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章
错误无法使 UICollectionElementKindCell 类型的视图出列