0

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

但我仍然得到宽字符,输出如下:

#10; "

而我想要:

"Fromula = Ï Ì â¡ ( c + / c 0 ) â 1 "

我们怎样才能避免呢?

4

1 回答 1

3

使用 HTTP 标头中可用的decoded_content编码和字符集信息来解码您的数据。但是,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 状态代码)。

于 2013-07-25T06:35:13.400 回答