文字コードを自動的にチェックしてテキストを取得する[perl編]

実は文字コードは、かなり色々あるのですが、基本的には3つです。

  • ShiftJIS
  • UTF-8
  • EUC-JP

ですね。
個人的にはEUC-JPが好みですが、
世の中のUTF-8化の流れには逆らえませんね・・・。
ShiftJISはWindowsがしつこく使用しているので無くなりそうにありません。

#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;
use HTML::TreeBuilder;
use Jcode;

# urlを指定する
my $url = 'https://www.pref.shizuoka.jp/';
#my $url = 'http://www.jalan.net/kankou/210000/';
# IE8
my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";
# LWPを使ってサイトにアクセスし、HTMLの内容を取得する
my $ua = LWP::UserAgent->new('agent' => $user_agent);
my $res = $ua->get($url);
my $content = $res->content;
# 文字コードを調べる
my $code = Jcode::getcode($content);
if ( $code ne 'utf8' ){
    $content = Jcode::convert( $res->content ,'utf8' , $code);
}
# HTML::TreeBuilderで解析
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);

# DOM操作
my @items =  $tree->find('html');
print $_->as_text."\n" for @items;

 

具体的に見てみましょう。
まず文字コードをチェックします。

my $code = Jcode::getcode($content);

UTF8の場合には変換しなくていいので、UTF8以外のときだけ変換するようにします。

if ( $code ne 'utf8' ){
    $content = Jcode::convert( $res->content ,'utf8' , $code);
}

変換元の文字コードを第3引数に入れています。
第3引数は省略できるのですが、たまにうまく変換できないことがあるため、入れています。