Perl楽しいから好き

Perlをはじめとしたプログラミング周りのあれこれについて。モダーンなPerlを楽しんでいます。

Perl のEncode.pm について。今さらながらに、わかったこと。

特に文字コードを意識することなく

フツーに文字コード shift_jis で書いたスクリプト内で、

日本語を print しても文字化けしないのは、

たまたま処理がうまくいってるだけなんだということが

今さらになって、わかった。

※ちなみに、WindowsXPPerl 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風に言う)



なぜなら、さっきと同じスクリプト

文字コード UTF-8 で保存するだけで

#!/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 は偉大だ!!