M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年2月24日 20:45

WWW::Mechanizeはmetaタグを見てデコードするが、charset=Shift_JISのコンテンツって実際にはCP932なので化けるじゃねえか問題

このエントリーをはてなブックマークに追加 mixiチェック

WWW::Mechanizeという、Perlで使う画面表示がないブラウザがあるんですけれども、こいつは取得するHTML文書がShift_JISでも、UTF-8でも、metaタグのcharset指定を読み込んで、デコードしてくれる機能が今は付いています。

(追記:自動でデコードしてくれる機能は、2006年9月の、バージョン1.21_01からのようです。HTTP::Messageモジュールの、decoded_contentメソッドを呼び出すことで実現しています。)

この機能は、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がいつから自動デコードするようになったか、という情報を追加。

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3507

コメントする