スクリプトと同じディレクトリに、shiftjis、7bit-jis の混在したテキストファイル [test.txt] があるという条件で検証。 コメントアウトしてある行を元に戻すことにより、問題が発生しなくなることを確認。
#!/usr/bin/perl
use strict;
use Encode;
use Encode::Guess;
use Text::Kakasi;
my %encoding_candidates = (
'Nihongo' => [ 'shiftjis', 'euc-jp', '7bit-jis' ]
);
# $Text::Kakasi::HAS_ENCODE = 0;
# パラメータを設定して辞書を開く
Text::Kakasi::getopt_argv("kakasi", "-w -ieuc -oeuc");
kakasi_test();
# 辞書を閉じる
Text::Kakasi::close_kanwadict();
sub kakasi_test {
my $line;
open(DB, "./test.txt");
while (<DB>) {
$line = $_;
# 文字コードを euc-jp に変換する
$line = convert_encoding( $line, '7bitjis', 'euc-jp', '7bitjis', @{$encoding_candidates{'Nihongo'}} );
print $line;
# 分かち書きを行う
$line = Text::Kakasi::do_kakasi($line);
print $line;
}
close(DB);
}
# 文字コードの変換
sub convert_encoding
{
my ( $string, $from, $to, $default, @candidates ) = @_;
require Encode;
require Encode::Guess;
# First, guess the encoding.
my $enc = Encode::Guess::guess_encoding( $string, @candidates );
if(ref $enc){
$from= $enc->name;
print "Guessed encoding : $from\n";
} else {
# If guess does not work, check whether $from is valid.
if (!(Encode::resolve_alias($from))) {
# Use $default as $from when $from is invalid.
$from = $default;
}
}
# 以下のコメント部分を元に戻すことにより、テスト用ファイルにおける問題は解消される
# if ( $from ne 'ascii' && $last_encoding ne $from ) {
# $last_encoding = $from;
#
# close_kakasi();
# init_kakasi();
# }
unless ($from eq $to) {
my ($orig_string) = $string;
# Workaround for Encode::Unicode error bug.
eval {
Encode::from_to($string, $from, $to);
};
$string = $orig_string if ($@);
}
return $string;
}