Perl 使用LWP::UserAgent检索ISO-8859-1编码网站的正确方法?

Perl 使用LWP::UserAgent检索ISO-8859-1编码网站的正确方法?,perl,encoding,iso-8859-1,lwp-useragent,Perl,Encoding,Iso 8859 1,Lwp Useragent,我正在使用带有以下代码的“LWP::UserAgent”检索一个“ISO-8859-1”编码的网站 问题是,特殊字符显示不正确,特别是欧元符号显示错误 内容编码被认为是‘ISO-8859-1’,这是正确的 要显示检索到的文本,我将其保存到一个文件中,并用Notepag++打开它 问题:如何以正确的方式检索“ISO-8859-1”编码的特殊字符 #SENDING REQUEST my $ua = LWP::UserAgent->new(); $ua->agent('Mozilla/5.0 (Wi

我正在使用带有以下代码的“LWP::UserAgent”检索一个“ISO-8859-1”编码的网站

问题是,特殊字符显示不正确,特别是欧元符号显示错误

内容编码被认为是‘ISO-8859-1’,这是正确的

要显示检索到的文本,我将其保存到一个文件中,并用Notepag++打开它

问题:如何以正确的方式检索“ISO-8859-1”编码的特殊字符


#SENDING REQUEST
my $ua = LWP::UserAgent->new();
$ua->agent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1'); # pretend we are very capable browser

my $req = HTTP::Request->new(GET => $url);

#add some header fields
$req->header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
$req->header('Accept-Language', 'en;q=0.5');
$req->header('Connection', 'keep-alive');
$req->header('Host', 'www.url.com');

#SEND
my $response = $ua->request($req);

#decode  trial1
print $response->content_charset(); # gives ISO-8859-1 which is right
my $content  = $response->decoded_content(); #special chars are displayed wrong

#decode trial2
my $decContent =  decode('ISO-8859-1', $response->content());
my $utf8Content = encode( 'utf-8', $decContent ); #special char € is displayed as Â

#decode trial3
Encode::from_to($content, 'iso-8859-1', 'utf8'); #special char € is displayed as  too


#example on writing data to file
open(MYOUTFILE, ">>D:\\encodingperl.html"); #open for write, overwrite
print MYOUTFILE "$utf8Content"; #write text
close(MYOUTFILE);


ISO-8859-1没有欧元符号。如果您需要欧元符号,您应该使用ISO-8859-15或更好的UTF-8。

ISO-8859-1没有欧元符号。如果您需要欧元符号,则应使用ISO-8859-15或UTF-8(更好)。

与任何其他符号相同:

my $content = $response->decoded_content();
也就是说,字符集不包括欧元符号。你可能真的有。您可以按如下方式修复此问题:

my $content = $response->decoded_content( charset => 'cp1252' );
第二个问题是您没有对输出进行编码。你会这样做的

open(my $MYOUTFILE, '>>:encoding(cp1252)', 'D:\\encodingperl.html')
   or die $!;
print $MYOUTFILE $content;
如果不是您想要的cp1252,请使用适合您的编码,例如UTF-8。如果希望原始文件采用原始编码,请使用

my $content = $response->decoded_content( charset => 'none' );

与任何其他文件相同:

my $content = $response->decoded_content();
也就是说,字符集不包括欧元符号。你可能真的有。您可以按如下方式修复此问题:

my $content = $response->decoded_content( charset => 'cp1252' );
第二个问题是您没有对输出进行编码。你会这样做的

open(my $MYOUTFILE, '>>:encoding(cp1252)', 'D:\\encodingperl.html')
   or die $!;
print $MYOUTFILE $content;
如果不是您想要的cp1252,请使用适合您的编码,例如UTF-8。如果希望原始文件采用原始编码,请使用

my $content = $response->decoded_content( charset => 'none' );


但它不是我的网站,所以编码ISO-8859-1我不能更改。不管怎么说,浏览器确实显示正确,即使它不在ISO-8859-1中。是否有办法将整个字符串转换为UTF8,并保留欧元符号?浏览器在位置128处显示带ISO-8859-1的欧元符号。这很方便,但在技术上是错误的。可能有效的方法是将ISO-8859-1重新编码为ISO-8859-15,将ISO-8859-15中的所有欧元符号字符128替换为164欧元符号,并将其重新编码为UTF-8.Thnx,但这不是我的网站,因此编码ISO-8859-1我无法更改。不管怎么说,浏览器确实显示正确,即使它不在ISO-8859-1中。是否有办法将整个字符串转换为UTF8,并保留欧元符号?浏览器在位置128处显示带ISO-8859-1的欧元符号。这很方便,但在技术上是错误的。可能有效的方法是将ISO-8859-1重新编码为ISO-8859-15,将ISO-8859-15中的所有欧元符号字符128替换为164欧元符号,并将其重新编码为UTF-8。您忘记了通过binmoding输出句柄将输出编码设置为utf8。您忘记了通过binmoding输出句柄将输出编码设置为utf8。我没有意识到解码的内容具有该charset参数;我打算建议使用内容加上手动编码::解码。无论如何,这是正确的答案,但需要注意的是,编码可能是ISO-8859-15,而不是cp1252。@hobbs,我不知道怎么做。iso-8859-15的欧元为A4。如果告知A4为iso-8859-1,浏览器将显示A4。当被告知是iso-8859-1时,浏览器显示欧元的唯一方式是遇到80,cp1252欧元。请记住,cp1252是iso-8859-1的超集。@霍布斯,不要使用内容。它不能摆脱一些gzipping。如果您想手动解码,可以使用我的$content=decode…,$response->decoded_content charset=>none;。像这样糟糕的网站非常普遍,HTML5规范指示浏览器假设任何报告其内容为ISO-8859-1的网站,并假设它实际上是Windows-1252。@cjm,酷,我不知道浏览器的行为是标准的。正在显示&x80;的欧元符号;也受HTML5支配?我不知道解码的内容有那个字符集参数;我打算建议使用内容加上手动编码::解码。无论如何,这是正确的答案,但需要注意的是,编码可能是ISO-8859-15,而不是cp1252。@hobbs,我不知道怎么做。iso-8859-15的欧元为A4。如果告知A4为iso-8859-1,浏览器将显示A4。当被告知是iso-8859-1时,浏览器显示欧元的唯一方式是遇到80,cp1252欧元。请记住,cp1252是iso-8859-1的超集。@霍布斯,不要使用内容。它不能摆脱一些gzipping。如果您想手动解码,可以使用我的$content=decode…,$response->decoded_content charset=>none;。像这样糟糕的网站非常普遍,HTML5规范指示浏览器假设任何报告其内容为ISO-8859-1的网站,并假设它实际上是Windows-1252。@cjm,酷,我不知道浏览器的行为是标准的。正在显示&x80;的欧元符号;也受HTML5支配?