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

Cam*_*oft 59 php xml encoding simplexml character-encoding

我收到错误:

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

尝试使用simplexml_load_string第三方源处理XML响应时.原始XML响应确实声明了内容类型:

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

然而,似乎XML并不是真正的UTF-8.XML内容的语言是西班牙语,包含DublínXML中的单词.

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

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

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

Jos*_*vis 75

您的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]);
}
Run Code Online (Sandbox Code Playgroud)

  • ISO-8859-1在西方世界广泛使用.如果它不是UTF-8,通常是ISO-8859-1.(或cp1252)至于每个字节的值,我只是查看了char表. (4认同)
  • 这非常有帮助.我能够使用utf8_encode()修复XML.你能告诉我你是如何从字符串`0xED 0x6E 0x2C 0x20`中解密编码的吗? (3认同)

Eri*_*rik 47

我解决了这个问题

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);
Run Code Online (Sandbox Code Playgroud)


小智 13

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

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
Run Code Online (Sandbox Code Playgroud)


Pau*_*ell 5

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

由于这篇文章以及以下内容,我们设法解决了我们的问题:

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