PHP生成的XML文件中的编码错误

时间:2013-04-03 18:49:25

标签: php mysql xml utf-8

我使用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

2 个答案:

答案 0 :(得分:0)

问题最终成为CDATA标签中存在的非ASCII字符,正如Colin在问题评论中指出的那样。

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

感谢科林和弗朗西斯的贡献。

答案 1 :(得分:0)

有些字符在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);