php5的simplexml解析错误
前阵子用simplexml来解析一个rss数据源,很轻松就获得了想要的结果.不想没几天就开始报错:
Warning: simplexml_load_file() [function.simplexml-load-file]: input conversion failed due to input error, bytes 0xAD 0xB5 0x3C 0x2F
刚开始猜想是php5的一个bug,但是搜索发现,有可能是rss源内混杂了其它编码的字符,导致simplexml解析错误.
也就是说,如果rss的声明是这样子:
XML:
-
<?xml version="1.0" encoding="GB2312"?>
那么rss内容一定要是gb2312.
解决办法
- 用iconv转换编码
- 修改encoding为正确的编码
作者: Volcano 发表于January 18, 2007 at 9:27 am
lugal 于 2007-01-25 @ 11:47:59 留言 :
Hi, 我也遇到这个问题了
你所谓的 iconv 转换编码如何实现?
是不是每次抓回来的feed包先检测 encoding ?那还不是会出错吗?
volcano 于 2007-01-25 @ 12:19:38 留言 :
是这样,我之前就已经知道了feed的encoding,所以直接进行了转码.用php的iconv转换编码比较容易:
string iconv ( string in_charset, string out_charset, string str )
代码:
echo iconv(“UTF-8″, “GBK”, “我是UTF-8的编码的字符串”);
lugal 于 2007-01-25 @ 13:50:43 留言 :
……那你这些 codes 就只能读一个类型的feed了?这个我也试过了。
你试过 php PEAR 里面的 XML_RSS 吗? 这个可能需要安装 PEAR 和 XML_PARSE package.
在 XML_PARSE package 程序文件中就可以设置 vali dencoding. 但是我这边可以读出BIG5 和 GBK 的 feed ,就是读GB2313的feed时会出错。不知道是不是操作系统的问题,我用的是UTF-8的windows professional SP2。
volcano 于 2007-01-25 @ 21:18:16 留言 :
有用过XML_RSS,但是没有深入. 我估计你可能做的是聚合之类的代码,所以会有这样的困扰. 目前我做的东东暂时没有这样的需求,因此解决方案也是相对的简单.
但是现在成熟的php聚合程序不少,它们应当也有类似的问题处理,你不妨找来参考一下.
lugal 于 2007-03-07 @ 18:00:14 留言 :
不喜欢用别人的东西,问题已经解决,参照这个修改的
http://minutillo.com/steve/weblog/2004/06/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
他也是处理GB2312,BIG5时的问题。他有中文BLOG,不过BLOG上的代码不能准确显示[我的是Firefox],所以给的英文的帖子链接。