Perl のEncode.pm について。今さらながらに、わかったこと。
特に文字コードを意識することなく
フツーに文字コード shift_jis で書いたスクリプト内で、
日本語を print しても文字化けしないのは、
たまたま処理がうまくいってるだけなんだということが
今さらになって、わかった。
※ちなみに、WindowsXP、Perl v5.10.1 な環境でやってます。
たとえば、
#!/usr/bin/perl # # Encode.pm と文字コードについての考察(print_unko_0.pl) # 2011.10.31_scripted by perl48 # # このファイルは文字コード shift_jis で保存してます use strict; use warnings; my $string = 'うんこ'; print $string;
っていうスクリプトでも、問題なく
って出力される。
でも、これは
『まぼろし〜!』(IKKO風に言う)
なぜなら、さっきと同じスクリプトを
#!/usr/bin/perl # # Encode.pm と文字コードについての考察(print_unko_1.pl) # 2011.10.31_scripted by perl48 # # このファイルは文字コード utf8 で保存してます use strict; use warnings; my $string = 'うんこ'; print $string;
ガッツリ文字化け〜♪
そこで、Encode.pm の登場〜!!
shift_jis で保存するなら、
#!/usr/bin/perl # # Encode.pm と文字コードについての考察(print_unko_2.pl) # 2011.10.31_scripted by perl48 # # このファイルは文字コード shift_jis で保存してます use strict; use warnings; use Encode; # 文字コード shift_jis 内のハードコーディングなので、'うんこ'も shift_jis my $string = 'うんこ'; # perl内部文字コードにデコードして $string = decode( "shift_jis", $string ); # 出力時にエンコードする ※Windowsのコマンドプロンプトの文字コード shift_jis に合わせる print encode( "shift_jis", $string );
って書いて、出力は↓
utf8 で保存するなら、
#!/usr/bin/perl # # Encode.pm と文字コードについての考察(print_unko_3.pl) # 2011.10.31_scripted by perl48 # # このファイルは文字コード utf8 で保存してます use strict; use warnings; use Encode; # 文字コード utf8 内のハードコーディングなので、'うんこ'も utf8 my $string = 'うんこ'; # perl内部文字コードにデコードして $string = decode( "utf8", $string ); # 出力時にエンコードする ※Windowsのコマンドプロンプトの文字コード cp932 に合わせる print encode( "cp932", $string );
って書いて、出力は↓
いや〜、Encode.pm は偉大だ!!