我正在尝试在Perl中下载网页的内容(公式)。我使用“LWP :: UserAgent”模块来解析内容并注意检查UTF8格式。代码如下:
use LWP::UserAgent;
my $ua = new LWP::UserAgent;
my $response = $ua->get('http://www.abc.org/patent/formulae');
my $content =$response->decoded_content();
if (utf8::is_utf8($content))
{
binmode STDOUT,':utf8';
}
else
{
binmode STDOUT,':raw';
}
print $content;
但我仍然得到广泛的角色和输出如下:
“Formula =







&#10 ;

(


 c


 +
 

 /


 c


 0
&#10 ;
)


 1
“
我想要:
"Fromula = Ï Ì â¡ ( c + / c 0 ) â 1 "
我们怎样才能避免这种情况?
答案 0 :(得分:3)
decoded_content
使用HTTP标头中提供的编码和字符集信息来解码您的数据。但是,HTML文件可能会指定不同的编码。
如果您希望输出文件为utf8,则应始终应用:utf8
图层。您要对is_uft8
进行的操作是错误。
Perl字符串内部存储有两种不同的编码。这对程序员来说绝对无关紧要。 is_utf8
只读取确定此内部表示的内部标志的值。仅仅因为没有设置该标志并不意味着当编码为utf8
时,字符串中的一个代码点可能不会被编码为多个字节。
您从服务器获取的数据具有不同级别的编码
"
。 decoded_content
负责前两个级别,其余的留给你。要删除实体,可以使用HTML::Entities
模块。咄。
use open qw/:std :utf8/; # Apply :utf8 layer to STD{IN,OUT,ERR}
...;
if ($response->is_success) {
my $content = $response->decoded_content;
print decode_entities $content;
}
请注意,我无法验证这是否有效;您给404的URL(恼人的,没有发送404状态代码)。