実際のPerlでの文字処理に関しては以前の記事でも書いたように下記の原則を守ればOKです。
- 原則1 外部から入力された文字列はデコードして内部文字列に変換する
- 原則2 外部へ出力する文字列はエンコードしてバイト文字列に変換する
- 原則3 ソースコードはUTF-8で保存し、utf8プラグマを有効にする
例えば外部からテキストファイル(内容は「あああ」というひらがなが入っているだけ)を読み込んで置換する処理を書くとします。
その場合コードは下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/usr/bin/perl use strict; use warnings; use Encode; use Data::Dumper; use utf8; my $file_name ='sample.txt'; open my $fh , '<' , $file_name or die "Can not open file " . $file_name; while( my $line = <$fh>){ debug_is_utf8( $line ); #utf8 flag off #原則1を適用 my $line2 = decode('UTF-8', $line); debug_is_utf8( $line2 ); #utf8 flag on #原則3によりuse utf8をしているため下記のような置換が有効になる $line2 =~ s/あ/ア/g; #原則2を適用 my $line3 = encode('UTF-8', $line2); debug_is_utf8( $line3 ); #utf8 flag off print $line3; "アアア"と出力 print "\n\n"; } sub debug_is_utf8{ my ( $str ) = @_; #utf8::is_utf8というメソッドでutf8フラグがついているかいなかの判定ができます。 if( utf8::is_utf8( $str) == 1 ) { print "utf8 flag on \n"; } else { print "utf8 flag off \n"; } } |
Perlのサイトで文字コードに対して下記のようなアドバイスを見かけました。
入り口で decode して,内部ではすべて flagged utf8 で扱い,出口で encode する.これがすべてです!とにかくこの基本方針をまもっていれば幸せになれます.
以前読んでも、そのときはあまり理解できませんでしたが、今回ようやくわかりましたね。
「業務に役立つPerl」以外にはこちらのリンクを参考にさせていただきました。
なおutf8フラグがついているとData::Dumperを使った場合、文字化けします。文字化けしないためには
1 2 3 4 5 6 7 |
use Data::Dumper; { package Data::Dumper; sub qquote { return shift; } } $Data::Dumper::Useperl = 1; |
と入れてあげればOKです。
Data::Dumper の日本語文字化けと Syntax::Collector。
Data::DumperでUTF-8フラグつき文字列をエスケープさせないようにするには