ルモーリン

Perlの文字コード

投稿:2012-01-09、更新:2012-01-12

PerlスクリプトをUTF-8で記述してWindowsのコンソールで実行、入出力ファイルもすべてUTF-8、バッククオートの実行結果を表示する場合、文字コードの設定を理解していなくて、手間取りました。 2012.01.12 色々なサイトを訪ねてようやく、こんな感じに落ち着きました。 Windowsのコンソールについて、文字コードはシフトJISに追加?変更?されていて、今ではコードページ932と呼ばれ、「cp932」となってる。 シフトJISにない文字で有名なのが丸数字と呼ばれるもので「⑨(○の中にアラビア数字の9)」とかが有名ですね。 20年前は「機種依存文字だー」と騒ぐ輩が五月蝿い(うるさい)ので自作のFEP(JKFF)では、白黒反転させて表示、 パソコン通信で、機種依存文字が明解に判別つくようにしていたのが良い思い出です。 当然ですが、このサイトはUTF-8で記述してありますから、機種依存なんてありません。
#!/usr/local/bin/perl -w

use strict;
use utf8;					#ソースはUTF-8
use Encode;					#文字コード変換用
use open IO => ":utf8";				#入出力ファイルの文字コードはUTF-8
binmode STDOUT, ":encoding(cp932)";		#標準出力をcp932(シフトJIS+α)に変換して出力させる

print "文字コードのテスト\n";			#UTF-8のリテラルは標準出力に行くとcp932(シフトJIS+α)に変換

my $ecode = "time /?";				#timeコマンドのヘルプ(cp932(シフトJIS+α))を出力させる文字列
$ecode = `$ecode`;				#バッククォートで実行、ヘルプを取得
utf8::encode($ecode);				#この変数はネイティブ(UTF-8)以外の文字コードでエンコードされている事をPerlへ伝える
$ecode = Encode::decode('cp932', $ecode);	#cp932(シフトJIS+α)でエンコードされているのをネイティブ(UTF-8)へデコード
print $ecode;					#変数でも標準出力に行くとcp932(シフトJIS+α)に変換