这个XML/文本文件有什么问题


What's wrong with this XML/text file?

我得到了这个 UTF-16 XML 文件来使用。我将其转换为 UTF-8 ( iconv -f UTF16 -t UTF8 'file-utf16.xml' > 'file-utf8.xml' ),但结果似乎不像是普通的文本文件。我正在使用OS X,当我在Sublime Text 2中打开此转换后的文件时,将显示以下内容,simplexml_load_file返回false

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<Item itemno="0000004" desc="" qtyavail="0" unitprice="0" salesprice="0" block="Yes" dnr="No"/>
<Item itemno="000001" desc="" qtyavail="0" unitprice="199.99" salesprice="199.99" block="No" dnr="No"/>
...

当我用textEdit打开它时,字符都很奇怪。它是汉字和其他一些东西的混合体,如下所示。原始 XML 文件中绝对没有中文,只有罗马字母、数字和 XML 中使用的其他典型字符。

㼼浸敶獲潩㵮ㄢ〮•湥潣楤杮∽呕ⵆ㘱•瑳湡慤潬敮∽潮㼢ਾ䤼整瑩浥潮∽〰〰〰∴搠獥㵣∢焠祴癡楡㵬〢•湵瑩牰捩㵥〢•慳敬灳楲散∽∰戠潬正∽教≳搠牮∽潎⼢ਾ䤼整瑩浥潮∽〰〰㄰•敤捳∽•瑱慹慶汩∽∰甠楮灴楲散∽㤱⸹㤹•慳敬灳楲散∽㤱⸹㤹•汢捯㵫丢≯搠牮∽潎⼢ਾ

编码有问题吗?如果是这样,我怎样才能将其制作成常规文本文件以通过simplexml_load_file读取。如果不是,这里有什么问题?实际上,此simplexml_load_file返回此文件上的false

更新:刚刚意识到,当我在XML文件中将字符串encoding="UTF-16"更改为encoding="UTF-8"时,一切正常。iconv不足以将其转换为 UTF-8 吗?

尝试在浏览器中打开它。

Xml 应具有根标记才能正确设置格式。

另外,也许可以尝试将编码设置更改为没有BOM的UTF-8。

对于您提供的 XML - 尤其是在字符串开头使用所谓的 XML 声明

<?xml version="1.0" encoding="UTF-16" standalone="no"?>

仅更改字符串的编码(就像您对iconv所做的那样)只是故事的一部分。您还需要反映与 XML 声明的内嵌(以及删除任何 BOM - 字节顺序标记)。一个同时执行这两项操作(字符串的重新编码和处理 XML 声明)的类是XMLRecoder

但是,在您的 UTF-16 情况下,这根本不必需的,因为 SimpleXML 支持 UTF-16(如果您的 iconv 有它,通常是这种情况)。

因此,您需要找出当simplexml_load_file返回FALSE时在具体中遇到哪些错误,因为该返回值表示错误条件 - 无法解析XML。

为此,请在开发时将错误报告启用到最高级别。还要记录错误并遵循错误日志。相关的问答是:

  • 如何在PHP中获取有用的错误消息?

只是说,如果有帮助,您肯定可以使用XMLRecoder