タグ :
perl
ファイルから文字列を読み込んだ場合は、decodeを使ってunicodeに変換すればよいことは前回書いた。
では、programの中に文字を書きたい場合はどうすればいいか。
my $s = "黒";
if( $s =~ /黒/) {print " black";}
これはうまく動くが
my $s = <DATA>;
if( $s =~ /黒/) {print " black";}
これはうまく行く場合と行かない場合がある。
これはprogram内に書かれた”黒”という文字とファイルに書かれた文字がどんな文字コードで表記されているのかに起因する。
Programもファイルも同じ文字コードで書かれていれば思ったとおりに動いてくれるが、一方がShift-JISで、一方がUTF-8だったりするとアウトである。
この問題を解決するためには冒頭に書いた
use utf8;
というおまじないを書くとうまくいく。
このおまじないは文字が現れるとそれを'UTF-8'コードで書かれたものと認識し、自動的に'unicode'に変換してくれるありがたい関数である。
use utf8;
my $s = decode('UTF-8',<DATA>);
if( $s =~ /黒/) {print " black";}
と
my $s = decode('UTF-8',<DATA>);
my $t = decode('UTF-8',"黒");
if( $s =~ /$t/) {print " black";}
とは同じ意味である。
もちろん、use utf8 と書きながらprogramをshift-jisで書いたらアウト。使っているテキストエディタがどの文字コードを使っているか気をつけないといけない。