スクリプトと同じディレクトリに、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; }