2

次のコードで「LWP::UserAgent」を使用して、「ISO-8859-1」でエンコードされた Web サイトを取得しています。

問題は、特殊文字が正しく表示されないことです。特に「€」記号が間違って表示されます。

コンテンツのエンコーディングは「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);


4

2 に答える 2

4

他のものと同じ:

my $content = $response->decoded_content();

つまり、iso-8859-1文字セットにはユーロ記号が含まれていません。あなたはおそらく実際にcp1252を持っています。次のように修正できます。

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

2 番目の問題は、出力をエンコードしないことです。これはあなたがそれを行う方法です。

open(my $MYOUTFILE, '>>:encoding(cp1252)', 'D:\\encodingperl.html')
   or die $!;
print $MYOUTFILE $content;

必要でない場合は、適切なエンコーディング ( などUTF-8)を使用してくださいcp1252。元のエンコーディングで元のファイルが必要な場合は、使用します

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

open(my $MYOUTFILE, '>>', 'D:\\encodingperl.html')
   or die $!;
binmode($MYOUTFILE);
print $MYOUTFILE $content;
于 2012-11-04T03:57:14.657 に答える
0

ISO-8859-1 にはユーロ記号がありません。ユーロ記号が必要な場合は、ISO-8859-15 を使用するか、できれば UTF-8 を使用する必要があります。

于 2012-11-04T00:55:10.810 に答える