【问题标题】:How to handle invalid unicode with simplexml如何使用 simplexml 处理无效的 unicode
【发布时间】:2011-12-07 15:55:28
【问题描述】:

Simplexml 失败并显示以下错误消息:

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

据我了解,投诉是关于无效的 Unicode 字符。第 299108 行没有“FFFE”,但包含“EFBFBE”。

有没有办法在 simplexml 中处理这种类型的错误?

【问题讨论】:

标签: php xml


【解决方案1】:

我经常遇到传入用户数据的问题,我研究了很多方法来解决它。有一些方法可以将传入数据正确编码为 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() 调用,而不会失败。

【讨论】:

  • 丑陋,但很难与结果争论。谢谢:)
  • 谢谢。不是最优雅的解决方案,但它确实有效!
  • 这绝对救了我!
  • 太好了,谢谢你,过滤掉了我从 Apple 的 MDM api 获得的所有无效字符
猜你喜欢
  • 2010-11-02
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多