使用Perl中的WWW :: Mechanize编码错误

时间:2014-06-06 16:03:38

标签: perl character-encoding mechanize

我试图通过WWW:Mechanize的网站发布内容。

我的内容似乎是UTF-8,我发布的网站是一个在HTML页面的头部指定ISO-8859-15编码的页面。

帖子有效,但我得到了这个结果

我的编码示例(法语):

acteur majeur de l?assurance et
référence en gestion
patrimoniale, propose une approche globale pour
une clientèle aisée et haut de gamme. 

这是我的代码

use WWW::Mechanize;
use Encode;
use open qw(:std :utf8);

my $mech = WWW::Mechanize->new(
   stack_depth => 0,
   timeout => 10,
);

mech->get($urlContentOtherWebsite);
my $tree = HTML::TreeBuilder::XPath->new_from_content($mech->content); 
my $content = $tree->findvalue('/html/body//div[@id="content"]');
$tree->delete;
mech->get($urlFormMyWebsite);
$mech->form_name("formular"); # Form Post Emploi
$mech->set_fields(
  content => $content
);
$mech->submit;

请问您有什么想法或线索来解决我的问题吗?

2 个答案:

答案 0 :(得分:3)

从研究代码: 在HTML::Form中使用的WWW::Mechanize使用accept-charset标记的<form...>参数来确定要使用的编码。如果没有这样的参数,则使用默认字符集,即UTF-8。您可以使用$form->accept_charset('iso-8859-1')设置可接受的字符集,例如如果我正确阅读代码,以下内容应该有效:

$mech->form_name("formular")->accept_charset('iso-8859-1');
$mech->set_fields(...);
$mech->submit;

答案 1 :(得分:1)

您需要添加

binmode STDOUT, ':encoding(utf-8)';

在程序开始时声明STDOUT期待UTF-8字符,否则您将看到单个字节而不是正确的字符

您还需要使用

将输入解码为UTF-8
use Encode;

接着是

decode('UTF-8', $_)

传入文本位于$_

这是一个例子

use utf8;
use strict;
use warnings;

use Encode;

binmode STDOUT, ':encoding(utf-8)';

print decode('UTF-8', $_) for <DATA>;

__DATA__
acteur majeur de l?assurance et
référence en gestion
patrimoniale, propose une approche globale pour
une clientèle aisée et haut de gamme. 

<强>输出

acteur majeur de l?assurance et
référence en gestion
patrimoniale, propose une approche globale pour
une clientèle aisée et haut de gamme. 

我不太了解l?assurance,但我想在原始网站和Stack Overflow帖子之间的某处已经改变了数据。如您所见,文本的其余部分是正确的