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
コメントする