【问题标题】:What is the best way to deal with XML that contains invalid characters (PHP)?处理包含无效字符 (PHP) 的 XML 的最佳方法是什么?
【发布时间】:2013-10-30 06:00:29
【问题描述】:

我正在使用 QBXML 与 Quickbooks 集成。我正在运行客户查询,Quickbooks 返回的 XML 似乎包含无效字符 (!)。

查看 quickbooks 返回的源 XML,我可以看到无效字符(出于隐私原因实际命名已更改,但我留下了有问题的字符):

<Contact>Ongél Davabond</Contact>

当我尝试解析 XML(使用 PHP XML 解析器,从 xml_parser_create() 开始)时,我收到一条无效字符消息。

我注意到 XML 标头只是:

<?xml version="1.0" ?>

我尝试用 preg_replace 替换它

<?xml version="1.0" encoding="utf-8" ?>

但这并没有什么不同。

鉴于我无法更改接收 XML 的方式,我该如何最好地处理它?有没有办法让 PHP XML 解析器接受这样的字符? PHP 是否有办法将任何无效字符转换为它们的 nnn;等价物,而不影响 XML 结构,还是我需要逐个字符地检查整个 XML 字符以查找无效字符并手动替换它们?我不知道将来会出现什么其他无效字符,所以我正在寻求一种一次性处理所有可能性的方法,而不是仅仅修复这个 'é' 字符。

【问题讨论】:

  • 您可能在某处丢失了原始流的正确 utd-8 编码...不确定您称之为“无效”的字符,即é 绝对没有错,如果它在原始文件中正确表示utf-8 流...
  • 您收到的确切信息是什么?它是否包含有关数据中特定字节的信息?请注意,“无效字符”在这里是用词不当。这一定意味着数据中的某些字节根本不表示任何字符,因为它们违反了 UTF-8 格式。最有可能的是,数据实际上是 UTF-8 以外的编码,可能是 windows-1252。如果你打开它,看看它是什么样子的,例如在记事本++中,编码设置为“ANSI”。
  • 我得到的确切消息是“XML 错误:第 55302 行的字符无效”,该行上唯一看起来很奇怪的字符是 é。据我了解,它应该以 UTF-8 的形式返回,但在 notepad++ 中它看起来像 ANSI,所以我将尝试将编码强制为 windows-1252,看看会发生什么
  • 是的,做到了,QB 将其作为 ISO-8859-1 发送,即使它应该是 UTF-8。谢谢!
  • 好的,听起来这已经为您解决了。然而,QB 不应该将文件声明为 UTF-8(就像他们所做的那样),而是命名具体的编码。请联系软件供应商并告诉他们问题并要求解决此问题,因为这根本不是有效的 XML。另外请回答您自己的问题,以便标记的问题得到回答。

标签: php xml character-encoding xml-parsing qbxml


【解决方案1】:

虽然我期待的是 UTF-8,但返回的 XML 是 ISO-8859-1。强制 ISO-8859-1 编码解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2018-02-21
    相关资源
    最近更新 更多