使用PHP读取XML时处理编码错误

时间:2011-08-27 15:45:29

标签: php xml encoding

我正在使用XMLReader来解析来自第三方的XML。这些文件应该是UTF-8,但是我收到了这个错误:

parser error : Input is not proper UTF-8, indicate encoding !

Bytes: 0x11 0x72 0x20 0x41 in C:\file.php on line 166

查看notepad ++中的XML文件,可以清楚地知道导致这种情况的原因是:有问题的行中包含一个控制字符DC1

XML文件由第三方提供,我无法可靠地解决此问题/确保将来不会发生这种情况。有人可以推荐一个处理这个问题的好方法吗?我想取消控制字符 - 在这种特殊情况下,只是从XML文件中删除它很好 - 但我担心总是这样做会导致无法预料的问题。感谢。

3 个答案:

答案 0 :(得分:0)

为什么第三方无法可靠地解决此问题?如果他们的XML中有非法字符,我会打赌这是一个有效的问题。

话虽如此,为什么不在使用str_replace解析它之前删除该字符?

答案 1 :(得分:0)

如果字符串有效 UTF-8,您可以使用str_replace()。请注意,str_replace()将使用字节偏移,因此您不再处理PHP字符串,而是使用字节字符串。

并且有一个问题:如果你的第三方包含随机空格和控制字符,这些字符在XML中没有用处,你可能会认为它们最终会破坏UTF-8。因此,在确定他们当前的当前转储并非完全无用之前,您不能放心地使用str_replace()(只是出于善意)。

也许您可以使用快捷方式将其填充到libxml DOMDocument对象中并使用@来抑制错误,让libxml库处理错误。类似的东西:

$doc = new DOMDocument();
if(@$doc->loadXML($raw_string)) {
  // document is loaded. time to normalize() it.
}
else {
  throw new Exception("This data is junk");
}

答案 2 :(得分:0)

为什么您和第三方在XML中交换数据?据推测,双方都希望通过使用XML而不是一些随机的专有格式来获得一些好处。如果你允许它们生成错误的XML(我更喜欢称之为非XML),那么任何一方都无法获得这些好处。修补他们的方式符合他们的利益。试着让他们相信这一点。