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ín
XML中的单词.
我无法让第三方整理他们的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)
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)