【发布时间】:2014-10-11 10:07:53
【问题描述】:
假设,我们有以下文件:
test.html
<!DOCTYPE html>
<html>
<head>
<title>Евгений Онегин</title>
<meta charset="utf-8">
</head>
<body>
<p><cite>Евгений Онегин</cite></p>
<pre>
Не мысля гордый свет забавить,
Вниманье дружбы возлюбя,
Хотел бы я тебе представить
Залог достойнее тебя,
</pre>
</body>
</html>
我想用解析器获取 HTML 格式的 body 标签的内容:
<p><cite>Евгений Онегин</cite></p>
<pre>
Не мысля гордый свет забавить,
Вниманье дружбы возлюбя,
Хотел бы я тебе представить
Залог достойнее тебя,
</pre>
parser.pl
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
use utf8;
use HTML::TreeBuilder;
my $root = HTML::TreeBuilder->new;
$root->parse_file('test.html');
my $body = $root->find('body');
print $body->as_HTML;
当我将输出保存到 HTML 文件并在浏览器中以 Unicode 格式观看时,编码被破坏:而不是“Евгений Онегин”,我得到的是“Евгений Онегин”。
正确的工作
当 HTML 存储在 Perl 文件中时,它可以正常工作:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
use utf8;
use Data::Dumper;
use HTML::TreeBuilder;
my $root = HTML::TreeBuilder->new;
$root->parse_file(\*DATA);
my $body = $root->find('body');
print $body->as_HTML;
__END__
<!DOCTYPE html>
<html>
<head>
<title>Евгений Онегин</title>
<meta charset="utf-8">
</head>
<body>
<p><cite>Евгений Онегин</cite></p>
<pre>
Не мысля гордый свет забавить,
Вниманье дружбы возлюбя,
Хотел бы я тебе представить
Залог достойнее тебя,
</pre>
</body>
</html>
因此,当 HTML::TreeBuilder 从文件中读取时,就会发生错误。
问题:
- 如何修复编码?
- 该模块将每个俄语字符编码为一个实体:
&#x415;。是否可以保存为字符Е?
【问题讨论】:
标签: perl encoding html-parsing