我收到了错误:
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内容的语言是西班牙语,在XML中包含Dublín
之类的单词。
我无法让第三方整理他们的XML。
如何预处理XML并修复编码不兼容性?
有没有办法检测XML文件的正确编码?
答案 0 :(得分:71)
您的0xED 0x6E 0x2C 0x20字节对应于ISO-8859-1中的“ín”,因此您的内容看起来像是ISO-8859-1,而不是UTF-8。告诉你的数据提供者有关它并要求他们修复它,因为如果它不适合你,它可能对其他人也不起作用。
现在有几种方法可以解决这个问题,如果无法正常加载 ,则只能使用 。其中之一就是使用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]);
}
答案 1 :(得分:46)
我用
解决了这个问题$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);
答案 2 :(得分:11)
如果您确定您的xml是以UTF-8编码但包含错误字符,则可以使用此功能来纠正它们:
$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
答案 3 :(得分:4)
我们最近遇到了类似的问题,但无法找到任何明显的原因。结果是我们的字符串中有 控制字符 ,但是当我们将该字符串输出到浏览器时,除非我们将文本复制到IDE中,否则该字符不可见。
我们设法解决了我们的问题,感谢this post和此:
preg_replace(&#39; / [\ x00- \ x1F \ x7F] /&#39;,&#39;&#39;,$ input);
答案 4 :(得分:3)
您可以简单地将这行代码放在mysql_connect语句之后,而不是使用javascript:
mysql_set_charset('utf8',$connection);
干杯。
答案 5 :(得分:2)
您可以在Firefox中打开第三方XML源并查看它自动检测为编码的内容吗?也许他们使用普通的旧ISO-8859-1,UTF-16或其他东西。
如果他们宣称它是UTF-8,并且服务于其他东西,他们的饲料显然会被打破。解决这样一个破碎的饲料对我来说感觉很糟糕(尽管我知道有时候不可避免)。
如果这是一个简单的案例,如“UTF-8与ISO-8859-1”,你也可以试试mb_detect_encoding()的运气。
答案 6 :(得分:2)
如果您下载XML文件并在例如Notepad ++中打开它,您会看到编码设置为UTF8之外的其他内容 - 我自己也遇到了与xml相同的问题,并且它只是在编辑器中编码:)
字符串<?xml version="1.0" encoding="UTF-8"?>
不设置文档的编码,它只是验证器或其他资源的信息。
答案 7 :(得分:1)
经过几次尝试,我发现htmlentities功能正常。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>AJAX jQuery</title>
<meta name="description" content="">
<meta name="author" content="">
<!-- Mobile Specific Meta -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
<!-- Stylesheets -->
</head>
<body>
<nav>
<a href="/ajax-test">Main</a>
<a href="external.html">Some link</a>
</nav>
<div id="main">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
<script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script>
<script src="ajax.js" charset="utf-8">
</script>
</body>
</html>
答案 8 :(得分:0)
使用doctrine生成映射文件时遇到了同样的问题。我通过删除某些字段在数据库中的所有注释来修复它。
答案 9 :(得分:0)
我刚遇到这个问题。结果是XML文件(不是内容)没有在utf-8中编码,而是在ISO-8859-1中编码。您可以在Mac上使用file -I xml_filename
进行检查。
我使用Sublime将文件编码更改为utf-8,而lxml导入它没有问题。