如何避免LWP :: UserAgent中的宽字符?

时间:2013-07-25 05:41:58

标签: perl

我正在尝试在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 "

我们怎样才能避免这种情况?

1 个答案:

答案 0 :(得分:3)

decoded_content使用HTTP标头中提供的编码和字符集信息来解码您的数据。但是,HTML文件可能会指定不同的编码。

如果您希望输出文件为utf8,则应始终应用:utf8图层。您要对is_uft8进行的操作是错误

Perl字符串内部存储有两种不同的编码。这对程序员来说绝对无关紧要。 is_utf8只读取确定此内部表示的内部标志的值。仅仅因为没有设置该标志并不意味着当编码为utf8时,字符串中的一个代码点可能不会被编码为多个字节。

您从服务器获取的数据具有不同级别的编码

  • 压缩等编码
  • 字符集
  • HTML
  • 指定的字符集
  • HTML实体,例如&quot

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状态代码)。