我正在使用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文件中删除它很好 - 但我担心总是这样做会导致无法预料的问题。感谢。
答案 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),那么任何一方都无法获得这些好处。修补他们的方式符合他们的利益。试着让他们相信这一点。