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

我收到错误:

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

尝试使用来自第三方源处理 XML 响应时。原始 XML 响应会声明内容类型:simplexml_load_string

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

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

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

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

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


答案 1

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

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

或者,您可以走很长很长的路,自己验证/修复序列。这将花费您一段时间,具体取决于您对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]);
}

答案 2

我用解决了这个问题

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

推荐