- 如何解决通讯中产生的无效进程
- 在AS4安装oracle 10g 客户端 出现如下提示 ,怎么解..
- 新手GTK/Glade 初级问题,但不得解决
- 【讨论】项目进度慢,如何解决
- 基于WEB的J2EE报表解决方案集锦 [精华]
- js代码执行 导致cpu过大 已经解决
- 请教关于使用let进行计算----已经解决
- 常见问题解决方案帖子集
- min-width IE下无法生效,请问有没有解决方法
- 复选框问题(已解决)
- 急救漫步者X400不响的解决办法!!!
- JSP和IIS之间的最佳解决方案
- 使用window.name解决跨域问题
- vc编程中遇到的一个错误 痛苦解决不了
- [已解决!另有其他疑问]Linux下spring找不到配置文..
- 流水帐,磁盘故障解决小记
- 这样可以取到想要的值吗(帮忙看一下谢谢) 问题还没..
- 有办法解决如下问题吗,删除行
- 500百万的mysql数据计算超时,有什么好的解决方法
- 一个Tomcat服务于多个IP,对应多个站点的配置解决方..
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)编码申明。
摘要: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)编码申明。
[编辑:百家电脑学院] [返回学院首页] [返回上一页] []
·上一篇:请教大家,怎么给图片加上水印 · 下一篇:if (/mod\:/){} 是什么意思?

