如何使用simplexml处理无效的unicode


How to handle invalid unicode with simplexml

Simplexml失败,出现以下错误消息:

simplexml_load_file(): fooo.xml:299108: parser error : Char 0xFFFE out of allowed range

根据我的理解,投诉是关于一个无效的unicode字符。第299108行没有"FFFE",但它包含"EFBFBE"。

是否有办法处理这种类型的错误在simplexml?

我在处理传入的用户数据时经常遇到这个问题,我研究了许多方法来解决这个问题。有一些方法可以将传入的数据正确地编码为UTF-8,而不需要经常导致这些问题的高阶(或其他)unicode值。

然而,消毒解决方案的问题在于它们会更改数据,如果您只想充当中间人,则仍然希望输出包含这些值。我能想到的唯一一种非破坏性的方法是让SimpleXMLElement可靠地不失败,这是公认的双重工作解决方案:

    libxml_use_internal_errors(true);
    $dom = new DOMDocument("1.0", "UTF-8");
    $dom->strictErrorChecking = false;
    $dom->validateOnParse = false;
    $dom->recover = true;
    $dom->loadXML($xmlData);
    $xml = simplexml_import_dom($dom);
    libxml_clear_errors();
    libxml_use_internal_errors(false);
技巧在于查看PHP文档中DOMDocument的属性,并注意那些允许您设置解析行为的额外变量。这个方法对我来说没有失败,对于所有用于使SimpleXMLElement因字符范围问题而失败的xml输入。

我唯一的猜测为什么它的工作原理是SimpleXMLElement做严格的检查初始化,但不是从现有的DOMDocument初始化。

这个方法允许后续的asXML()调用,而不会失败。