问题讨论:程序 C/C++ Java GUI编程 ASP Php Shell Perl Web开发 软件工程 三大件 机箱 存储设备 光存储 音频设备 视频设备 外设 购机
asp php java C CGI .net vb delphi unix&linux sql Word Excel WPS OutLook Powerpoint Dreamweaver FPage/Golive CSS/HTML DOM/JS
热门词:流程图 excel 入侵检测 vss Windows 安全漏洞 QQ空间 事件编程 MFC

 程序设计交流 > Perl 

解决Perl 5.8.8用XML::RSS无法解析非utf-8编码的RSS问题

[2008-11-18 1:15:13] [来源: 百家电脑学院] [我要投稿]

2008-11-17 12:14撒哈拉里的(9php.com)鱼
解决Perl 5.8.8用XML::RSS无法解析非utf-8编码的(9php.com)RSS问题

摘要:XML-RSS-1.36是 常用的(9php.com)操作RSS的(9php.com)模块,不过遗憾的(9php.com)是,不支持gb2312,big5等编码的(9php.com)rss文件,操作的(9php.com)话直接报错“Couldn't open encmap gb2312.enc”退出。今天一段代码读baidu的(9php.com)新闻rss 时遇到这个问题,先鄙视一下他用gb2312编码。网上搜索到的(9php.com)解决方案在我这里无效,最终自己比较不优雅的(9php.com)解决了一下。      

      这个问题发生的(9php.com)原因是XML::RSS模块会调用XML::Parser模块,最终是调用的(9php.com)Perl的(9php.com)核心库Expat,这东西是C写的(9php.com),不支持gb2312编码。网上搜索到的(9php.com)解决办法如下:
      1. Download GB2312.TXT from ftp.unicode.org,事实上这个东西目前下载地址是http://search.cpan.org/src/GUS/Unicode-UTF8simple-1.06/gb2312.txt      
      2. Download the XML::Encoding 1.01 and get two binaries: make_encmap and compile_encoding,这东西在d:\perl\bin下面,根据的(9php.com)安装目录而有变化。
      3. run make_encmap as follows:make_encmap GB2312 GB2312.TXT > GB2312.encmap
      4. Add expat='yes' to the first line of GB2312.encmap
      5. run compile_encoding: compile_encoding -o GB2312.enc GB2312.encmap
      6. copy GB2312.enc to /usr/lib/perl5/site_perl/5.005/i386-linux/XML/Parser/Encoding,windows的(9php.com)话,lib/下面自己去找。

      不过遗憾的(9php.com)是,现在这种方法已经不行了,最后在<<Thinking in perl>>中找到原因,如下:
      使用 make_enmap 的(9php.com)时候需要改下载来的(9php.com)GB2312.TXT。因为在 GB2312.txt  中,中文编码0x2121  的(9php.com)应该为 0xa1a1 , 即第一列值全部需要加 0x8080,这样就可以了。修改 make_enmap给需要处理的(9php.com)地方每个值加 0x80。

      不过这样还是太麻烦了,我的(9php.com)做法是直接给XML文件编码一下,代码片段如下:
[list=1][*]$xml = get( 'http://news.baidu.com/n?cmd=1&class=internet&tn=rss⊂=0' );[*][*]if(defined($xml) )[*]{[*]warn "$!n";[*]return;[*]}[*][*]if( $xml =~ /s+encoding="(.*?)"/ )[*]{[*]$encode = $1;[*]}[*][*]if ( &trim($encode) eq "" )[*]{[*]print "No encode found, use utf-8.n";[*]}[*][*]if( ($encode ne "") && ($encode ne "utf-8") && ($encode ne "UTF-8") )[*]{[*]$xml = decode_utf8( decode( $encode$xml ) );[*]}[*]$xml =~ s/encoding="(.*?)"/encoding="utf-8"/;[*][*]my $rss = new XML::RSS;[*]$rss->parse($xml);[/list]      
      先抓取RSS数据,然后查询编码,不是utf-8的(9php.com)话,自己解码再编码到utf-8,并且记得要替换xml文件中的(9php.com)编码申明。

·解决Perl 5.8.8用XML::RSS无法解析非utf-8编码的RSS问题 | 相关文章·

·百家学院 | 最新评论·