綾小路龍之介の素人思考

[perl] Encodeの基本とEncodeを速く使う方法

覚えようとしない自分に活を入れるための覚書。基本:入力後にdecode、出力前にencode。高速:find_encodingは1度だけ。

まとめると以下のようになる。eucjpの文字列を読んで、decodeする。decodeした文字列は元の文字列のエンコードに依存ぜず、強制的にutf8。出力する前にencode。DATAファイルハンドルから読み込む都度find_encodeingを読んでいないので高速。

#!/usr/bin/perl -w
use strict;
use warnings;
use Encode;

my $enc_eucjp = find_encoding('eucjp');
my $enc_utf8  = find_encoding('utf8');
while (<DATA>) {
        my $utf8 = $enc_eucjp->decode($_);
        # ...
        print $enc_utf8->encode($utf8);
}
exit;
__END__
日本語
テスト

入力のエンコードが既知(eucjp)の場合は問題ないが、各読み込みで入力のエンコードがわからない場合はその都度guess_encodingする。その場合は必ずエラーチェック。guess_encodingの戻り値がリファレンスになっていれば成功。ただの文字列なら失敗。

#!/usr/bin/perl -w
use strict;
use warnings;
use Encode;
use Encode::Guess;

my $enc_eucjp = find_encoding('eucjp');
while (<DATA>) {
        my $enc = guess_encoding($_, qw/euc-jp shiftjis 7bit-jis/);
        my $utf8 = '';
        if (!ref($enc)){
                die "Can't guess: $enc";
        } else {
                print 'guess: ', $enc->name;
                $utf8 = $enc->decode($_);
        }
        # ...
        print $enc_eucjp->encode($utf8);
}
exit;
__END__
日本語
テスト

utf8フラグとかどうするんだっけなぁ。。。

リファレンス

  1. perl encode - Google 検索
  2. 404 Blog Not Found:perl tips - Encodeを速く使う方法
  3. 404 Blog Not Found:perl - Encode 入門
  4. 404 Blog Not Found:ruby|perl - 文字コードのちょっと高度な判定
  5. guess_encoding - Google 検索
  6. Encode::Guess -- データからエンコーディングを推測する
  7. encode_utf8 - Google 検索
  8. Perl/日本語処理 - Wikibooks

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-01-08T09:20:42+09:00
  2. Modified: 2009-01-08T09:20:42+09:00
  3. Generated: 2017-09-28T23:09:19+09:00