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:
  1. <?xml version="1.0" encoding="GB2312"?>

那么rss内容一定要是gb2312.

解决办法

  • 用iconv转换编码
  • 修改encoding为正确的编码

作者: Volcano 发表于January 18, 2007 at 9:27 am

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原始出处作者信息及此声明

Tags:

5 条评论 »

  1. lugal 于 2007-01-25 @ 11:47:59 留言

    Hi, 我也遇到这个问题了
    你所谓的 iconv 转换编码如何实现?
    是不是每次抓回来的feed包先检测 encoding ?那还不是会出错吗?

  2. 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的编码的字符串”);

  3. 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。

  4. volcano 于 2007-01-25 @ 21:18:16 留言

    有用过XML_RSS,但是没有深入. 我估计你可能做的是聚合之类的代码,所以会有这样的困扰. 目前我做的东东暂时没有这样的需求,因此解决方案也是相对的简单.

    但是现在成熟的php聚合程序不少,它们应当也有类似的问题处理,你不妨找来参考一下.

  5. 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],所以给的英文的帖子链接。

RSS 为此帖反馈评论 · 反向跟踪 网站

留条评论