simplexml_load_string正在变成“”

时间:2014-09-18 22:14:02

标签: php xml simplexml

我正在使用simplexml_load_string将XML文档加载到对象中。在我遇到这个元素之前,这似乎很有效:

<some_string_val>1.&#160;&#160;&#160;&#160; Some text.</some_string_val>

运行simplexml_load_string之后,出现的是:

["some_string_val"]=> string(20) "1.     Some text"

我尝试使用:

html_entity_decode($string,  ENT_QUOTES, "Windows-1252");

这似乎将&#160;转换为纯文本,但当我尝试通过simplexml_load_string运行时,我得到了相同的结果。我也尝试过使用UTF-8和其他一些类似或更差的结果。

那么,我可以做些什么来将&#160;转换为UTF-8,以便simplexml_load_string正确解析它?保持HTML实体不变不是一个问题,因为这将进入CSV。

编辑:由于以下几个原因,这被不公正地标记为重复:

  1. 这不是语言不可知的;这是处理一组特定的PHP函数,不像这个标记为
  2. 的帖子
  3. 这不是HTML页面或PDF,它是CSV,所以我无法设置标题。接受的解决方案不适用于我的情况

2 个答案:

答案 0 :(得分:0)

我认为它解析正确。它只是函数的工作方式,用特殊字符替换这些代码。

您可以修复结果字符串,将其转换为cp1251

$str = iconv('utf-8', 'cp1251', $str);

此外,我会在将其写入CSV文件之前删除双倍空格

$str = str_replace(chr(160), ' ', $str);
$str= trim(preg_replace('/\s+/', ' ', $str));

答案 1 :(得分:0)

SimpleXML本身没有问题来正确解析XML:

$string = '<some_string_val>1.&#160;&#160;&#160;&#160; Some text.</some_string_val>';
$xml = simplexml_load_string($string);
echo $xml;

输出(Demo):

1.     Some text.

在您读完UTF-8字符串(C2 A0)之后会发生什么,您将它发送到某个地方并告诉某处不是它是UTF-8编码的,而是使用不同的编码。很可能是Latin-1,我不得不猜测,你没有与你的问题分享这类信息。

然后,某处将二进制序列C2 A0显示为两个字符:

  1. C2Â
  2. A0“”(没有休息空间)
  3. 例如:您需要写入CSV文件。您可以在其中编写UTF-8编码的数据。当您在电子表格应用程序中打开CSV文件时,它应该询问您有关编码的信息。告诉它使用Unicode UTF-8编码。一切都很好。

    如果您在浏览器中显示该阵列(这是我阅读您的问题的方式),请告诉您的浏览器该网站是UTF-8。您应该在Web浏览器菜单中找到“编码”设置来执行此操作。