php xml 中文,php-SimpleXML和中文

我正忙于尝试处理以下RSS feed:Yahoo Search RSS,一旦获取数据,就使用以下代码:

$response = simplexml_load_string($data);

但是,当我询问简单的xml对象时,99%的中文字符和字符串会消失.

我尝试通过执行以下操作将传入的数据转换为utf8:

$data = iconv(“ UTF-8”,“ UTF-8 // TRANSLIT”,$data);

但这也无济于事.

在数据达到simplexml_load_string之前,其100%的罚款.但是后来,事实并非如此.

有任何想法吗?

解决方法:

您描述的内容听起来像是编码问题.编码就像一条链,如果在处理的某一部分被打断,则可能会损坏数据.

当您从RSS服务器请求数据时,您将获得特定字符编码的数据.您应该首先发现的是该数据的编码.

Data URL: http://tw.blog.search.yahoo.com/rss?ei=UTF-8&p=%E6%95%B8%E4%BD%8D%E6%99%82%E4%BB%A3%20%E9%9B%9C%E8%AA%8C&pvid=QAEnPXeg.ioIuO7iSzUg9wQIc1LBPk3uWh8ABnsa

根据网站标题,编码为UTF-8.这是标准的XML编码.

但是,如果标题未对数据进行UTF-8编码,那么在继续操作之前,您需要找出数据的正确编码并将其放入UTF-8.

我不使用simplexml,而是使用DomDocument.所以我不能说是否.但是我建议您改用DomDocument.它绝对支持UTF-8进行加载,并且返回的所有数据也都以UTF-8编码.您应该安全地假设simplexml也可以正确处理UTF-8.

链的下一部分是您的展示.您写道您的数据已损坏.怎么说呢您如何查询simplexml对象?

回顾编码链

如所写,编码就像一条链.如果一个元件损坏,则整个结果将被损坏.为了找出中断的地方,必须单独检查每个元素.您要使用的编码是此处的UTF-8.

>输入数据:所有检查均正常:

>检查:编码数据似乎是UTF-8吗?结果:是的.从给定的数据URL获取的输入数据确实验证了UTF-8编码.可以使用提供的数据对此进行正确测试.

>检查:原始xml数据是否将自身标记为UTF-8编码?结果:是的.可以在以下第一个字节中进行验证:.

>简单XML数据:

>检查:simple_xml是否支持UTF-8编码?结果:是的.

>检查:simple_xml是否以UTF-8编码返回值?结果:是和否.通常,simple_xml支持包含以UTF-8编码的文本的属性,但是,带有xml数据的simple_xml对象实例的var_dump()表明它不支持CDATA. CDATA用于相关数据. CDATA元素将被删除.

此时,这看起来像您要面对的错误.但是,您可以将所有CDATA元素转换为文本.为此,您需要在加载XML数据时指定一个选项.该选项是一个称为LIBXML_NOCDATA的常量,它将合并CDATA作为文本节点.

以下是我用于上述测试的示例代码,并演示了如何使用该选项:

$data_url = 'http://tw.blog.search.yahoo.com/rss?ei=UTF-8&p=%E6%95%B8%E4%BD%8D%E6%99%82%E4%BB%A3%20%E9%9B%9C%E8%AA%8C&pvid=QAEnPXeg.ioIuO7iSzUg9wQIc1LBPk3uWh8ABnsa';

$xml_data = file_get_contents($data_url);

$inspect = 256;

echo "First $inspect bytes out of ", count($xml_data),":\n", wordwrap(substr($xml_data, 0, $inspect)), "\n";

echo "UTF-8 test: ", var_dump(can_be_valid_utf8_statemachine($xml_data)), "\n";

$simple_xml = simplexml_load_string($xml_data, null, LIBXML_NOCDATA);

var_dump($simple_xml);

/**

* Bitwise check a string if it would validate

* as utf-8.

*

* @param string $str

* @return bool

*/

function can_be_valid_utf8_statemachine( $str ) {

$length = strlen($str);

for ($i=0; $i < $length; $i++) {

$c = ord($str[$i]);

if ($c < 0x80) $n = 0; # 0bbbbbbb

elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb

elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb

elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb

elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb

else return false; # Does not match

for ($j=0; $j

if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))

return false;

}

}

return true;

}

我认为这将解决您的问题.如果不是,则DomDocument能够处理CDATA元素.由于未进一步测试编码链,因此在进一步处理数据时仍可能会遇到编码问题,因此请注意将编码保持在输出水平.

标签:php,encoding,character-encoding,xml,simplexml

来源: https://codeday.me/bug/20191009/1877918.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值