【问题标题】:Bad encoding with WWW::Mechanize in Perl在 Perl 中使用 WWW::Mechanize 进行错误编码
【发布时间】:2014-06-06 16:03:37
【问题描述】:

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

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

【问题讨论】:

    标签: perl character-encoding mechanize


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你需要添加

      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 帖子之间的某个地方发生了更改。可以看到,其余文字是正确的

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2023-03-12
      • 2011-12-14
      相关资源
      最近更新 更多