【问题标题】:Encoding Error in PHP Generated XML FilePHP 生成的 XML 文件中的编码错误
【发布时间】:2013-04-03 18:49:25
【问题描述】:

我使用 DOMDocument 类在 PHP 中生成了一个 XML 文件,数据是从 MySQL 数据库中获取的。很多数据都包含 HTML 标记,但我已将其全部封装在 CDATA 部分中。

起初该文件有很多编码错误,但在将其放入文件之前通过 utf8_encode() 运行所有内容似乎已经修复了除一个之外的所有错误。

这是我现在遇到的错误:

    error on line 5113 at column 450: Input is not proper UTF-8, indicate encoding !
    Bytes: 0x14 0x31 0x30 0x30

我在这里发现了一些类似错误的帖子,但没有一个解决了我的问题,或者建议使用 utf_encode()。这是似乎触发错误的部分:

    ...quiet portable package. ]]></Summary><Features><![CDATA[The EF4500iSE was designed for maximum fuel...

错误似乎在 CDATA[ 和 The 之间,虽然我看不到那里的任何字符,并且该部分与文件中的每个其他 CDATA 块相同。如果我删除整个 Features 元素及其内容,则文件加载正常。

这是文件的链接:http://test.hhdev.hothousemarketing.com/inventory.xml

【问题讨论】:

  • 在那个特定的 CDATA 标签中,“rpm”和“1000”之间似乎有一个奇怪的字符。你试过utf8_encode吗?
  • 是的,我输入的所有内容都首先通过 utf8_encode()
  • 是的,删除你提到的字符修复它,现在可以在生成文件时在 PHP 中删除它?
  • 蛮力方法是对非 ASCII 字符进行正则表达式替换——尽管我个人不喜欢这种解决方案。老实说,这有点取决于您的应用程序
  • 您应该从源数据中删除垃圾字符(字节0x14)。它没有业务存在。如果您使用createTextNode() 而不是createCDATASection(),那么您至少会在保存文档而不是解析文档时收到这些字符的警告。

标签: php mysql xml utf-8


【解决方案1】:

正如 Colin 在问题的 cmets 中指出的那样,问题最终是 CDATA 标记中存在的非 ASCII 字符。

我急于解决这个问题,所以我只使用了蛮力方法,除了 utf8_encode() 之外,我还通过正则表达式替换运行了所有内容,我使用了: $output = preg_replace('/[^(\x20-\x7F)]*/','', $output); 我在这里找到了这个:http://www.stemkoski.com/php-remove-non-ascii-characters-from-a-string/

感谢 Colin 和 Francis 的贡献。

【讨论】:

    【解决方案2】:

    某些字符在 XML 中是完全不允许的,即使在 CDATA 部分中,甚至是实体编码的。

    您也许可以在 UTF-8 字符串上使用它(未经测试):

    $xml_legal_chars = preg_replace('/[\x{00}-\x{08}\x{0B}\x{0C}\x{0E}-\x{1F}\x{D800}-\x{DFFF}\x{FFFE}\x{FFFF}]/u', '', $utf8string);
    

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多