Perl/役に立つモジュール

Perl モジュール Encode::Guess で文字コードを判別(2ページ目)

プログラムからCSVファイルやHTMLファイルなどの外部ファイルを読み込む場合、正しく文字コードを指定しないと文字化けします。一方、毎回外部ファイルに合わせてプログラム内の指定を変えているとプログラムの汎用性が落ちてしまいます。Perl モジュール Encode::Guess を使って文字コードを自動的に判別して開く方法を紹介します。

井上 みやび子

執筆者:井上 みやび子

Perlガイド

文字コード候補の指定

Encode::Guess を使う時に一点だけ配慮しなければならない点があります。それは、use する時に可能性のある文字コードを Perl のエンコーディング表現で指定しなければならない点です。以下のコードがこの部分に相当します。
use Encode::Guess qw/cp932 euc-jp 7bit-jis utf8/;
ここでは、日本語の主な文字コード4つを指定しています。この指定は通常の文字コード表記と異なり、「UTF-8」の場合は「utf8」と小文字のハイフンなしになるので注意して下さい(※4)。

※4 実は表記の間違いや揺れをある程度モジュール側で解釈してくれますが、プログラムコードが混乱するので正式な表記をするように心がけて下さい。

何が指定できるかは、以下のコマンドで表示できます。

perl -MEncode -e 'print join qq{\n}, Encode->encodings(q{:all}),qq{\n}'

日本語関係のエンコーディング表現の詳細は、以下のコマンドで表示できます。
perldoc Encode::JP

文字コード自動判別の汎用関数

さてそれでは、この文字コード判別フローを転用して、汎用的なファイルオープン関数を書くと例えば以下のようになります。

use strict;
use warnings;
use utf8;
use Encode::Guess qw/cp932 euc-jp 7bit-jis utf8/; #文字コードの候補を指定して use する

# 文字コードを判別してファイルオープン(読み込み用)
# 引数:ファイルパス
# 戻り値:オープンしたファイルハンドル(エラーの場合は未定義)、エラーメッセージ
sub open_binary4read{
	my $file = shift;
	
	#引数チェック
	$file and -f $file
		or return (undef, 'File path not set or file does not exists.');
	
	my $fh;
	unless (open ($fh, '<:raw', $file)){ #文字コード指定なしで1回ファイルを開く
		return(undef, "OPEN FAILED: $file, $!");
	}
	my ($temp, $i);
	while ($temp .= <$fh> and ++$i < 50){ #最大50行(実は49行)まで変数に保存
		eof and last;
	}
	close ($fh);
	my $genc = guess_encoding($temp); #文字コード判別
	
	#Perlでのエンコーディング指定を取得。判別できない場合のデフォルトを指定
	my $enc = eval{$genc->name} || 'cp932';
	
	#もう一度ファイルを開く
	unless (open ($fh, "<:encoding($enc)", $file)){
		return(undef, "OPEN FAILED: $file, $!");
	}
	
	#取得したファイルハンドルを返す
	return ($fh, undef);
}

#__END__

#テスト

binmode STDOUT, ':utf8'; # Windows の場合は cp932

#読み込み
my ($fh, $error) = &open_binary4read(shift);

#ファイルハンドルを使うテスト:内容を書き出してみる
if ($fh and !$error){
	while(<$fh>){
		print $_;
	}
	
	close ($fh);
}
関数の下にテスト用のコードも入れましたので、コードを open_binary.pl の名前で保存すると以下のコマンドでファイルが文字化けせずに読み込めているかを確かめる事ができます。

perl open_binary.pl (ファイル名)
【編集部おすすめの購入サイト】
Amazonで Perl 関連の書籍をチェック!楽天市場で Perl 関連の書籍をチェック!
  • 前のページへ
  • 1
  • 2
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます