WWW::Mechanizeはmetaタグを見てデコードするが、charset=Shift_JISのコンテンツって実際にはCP932なので化けるじゃねえか問題
スポンサードリンク
WWW::Mechanizeという、Perlで使う画面表示がないブラウザがあるんですけれども、こいつは取得するHTML文書がShift_JISでも、UTF-8でも、metaタグのcharset指定を読み込んで、デコードしてくれる機能が今は付いています。
この機能は、WWW::Mechanizeの主な機能、自動巡回をするときに生きてくるのです。たとえば、「次の20件」のリンクをたどりたい場合は、
use utf8;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get('http://www.example.com/');
$mech->follow_link(text => '次の20件');
でたどれるのも、WWW::Mechanizeが自動的にデコードしてくれるからなのです。
しかし、この自動デコードって困りませんか?
世の中には、charsetにShift_JISを指定していても、実際にはCP932のコンテンツであることって多いです。
例えば、
Filename: sjis.html(シフトJISで保存)
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
<title>髙橋 山﨑 テスト</title>
</head>
<body>
<p>髙橋</p>
<p>山﨑</p>
</body>
</html>
これを、こんなコード
use strict;
use warnings;
use utf8;
use WWW::Mechanize;
binmode STDOUT => ':utf8';
my $mech = WWW::Mechanize->new();
$mech->agent('Windows IE 6');
$mech->get('http://www.example.com/sjis.html');
print $mech->content();
exit;
__END__
で取得すると……
$ perl sjis.pl
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
<title>��橋 山�ア テスト</title>
</head>
<body>
<p>��橋</p>
<p>山�ア</p>
</body>
</html>$
となってしまう。CP932には、髙や﨑が入っているんですが、metaタグのcharset指定ではShift_JIS指定だからしょうがない……
WWW::Mechanize使うコンテンツって、結構「髙橋 山﨑」が入っていることって多くないですか?
他の人はどうやっているんだろう……
(2011-02-25 2:24追記)
本文中の、WWW::Mechanizeがいつから自動デコードするようになったか、という情報を追加。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3507





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする