错误:使用PHP的simplexml_load_string“input不正确的UTF-8,指示编码!

我收到错误:

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

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

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

但是,XML似乎并不是真正的UTF-8。 XML内容的语言是西class牙语,在XML中包含像Dublín这样的Dublín

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

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

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

您的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将string从UTF-8转换为UTF-8,并希望他们能为您解决这个问题。 (他们不会,但你至less可以忽略无效的字符,所以你可以加载你的XML)

或者你可以走长长的路,并自己validation/修复序列。 这将需要你一段时间,取决于你对UTF-8的熟悉程度。 也许有些图书馆会这样做,尽pipe我不知道。

无论哪种方式,通知您的数据提供商,他们发送无效的数据,以便他们可以修复它。


这是一个部分的修复。 它绝对不会解决所有问题,但会解决一些问题。 希望足够让你一直到你的提供者修理他们的东西。

 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]); } 

我解决了这个使用

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

如果您确定您的xml使用UTF-8编码但包含错误的字符,则可以使用此函数来纠正它们:

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

而不是使用JavaScript,你可以简单地把这行代码放在你的mysql_connect句子之后:

 mysql_set_charset('utf8',$connection); 

干杯。

我们最近遇到类似的问题,无法find任何明显的原因。 结果是我们的string中的一个控制字符 ,但是当我们将该string输出到浏览器时,除非我们将文本复制到IDE中,否则字符不可见。

我们设法解决我们的问题感谢这篇文章和这个:

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

如果你下载的XML文件,并打开它,例如在记事本++中,你会看到,编码设置为UTF8以外的其他东西 – 我有自己的xml一样的问题,这只是在编辑器中编码:)

String <?xml version="1.0" encoding="UTF-8"?>不要设置文档的编码,它只是validation器或其他资源的信息。

你可以在Firefox中打开第三方XML源代码,看看它自动检测为编码? 也许他们正在使用普通的ISO-8859-1,UTF-16或其他东西。

如果他们宣称它是UTF-8,并且服务其他东西,他们的饲料显然被打破。 围绕这样一个破碎的饲料,我觉得很可怕(即使有时不可避免的,我知道)。

如果是“UTF-8与ISO-8859-1”之类的简单情况,那么你也可以用mb_detect_encoding()来试试你的运气。

几次尝试后,我发现htmlentitiesfunction的作品。

 $value = htmlentities($value) 

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

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

我使用Sublime将文件编码更改为utf-8,而lxml导入它没有问题。