Perlで日本語を扱うときの設定
Mac&Linux環境
MacやLinuxみたいな、ターミナルのデフォルトエンコーディングがUTF-8の環境ならこれでOK。
PerlのIOレイヤーと標準入出力(エラー出力含む)がUTF-8でエンコード/デコードされるようになります。
#!/usr/bin/perl use strict; use warnings; use utf8; use open IO => qw/:utf8 :std/;
Windows環境
Windowsの場合は、コマンドプロンプトエンコーディングがcp932なので(PowerShellもごていねいにcp932)、標準出力がUTF-8だと正常に文字を出力することができません。
そこで、標準入出力はbinmode文でエンコーディングをcp932にセットしておきます。
#!/usr/bin/perl use strict; use warnings; use utf8; use open IO => qw/:utf8/; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)";
WindowsとMacでスクリプトを共用する
Dropboxなどを使って、Windows、Mac、Linuxといった複数の環境でスクリプトを使い回す場合、いちいち環境に応じてスクリプトを書き直すのは面倒です。
そんなときは、Encode::Localeモジュールを利用します。
Encode::Localeモジュールは、「console_in」「console_out」といったキーワードに、環境に応じたエンコーディング名を提供してくれます。
#!/usr/bin/perl use strict; use warnings; use utf8; use Encode::Locale; use open IO => qw/:utf8/; binmode STDIN => ":encoding(console_in)"; binmode STDOUT => ":encoding(console_out)"; binmode STDERR => ":encoding(console_out)";
コマンドライン引数を使用する場合は、
Encode::Locale::decode_argv; my ($path, $newfile) = @ARGV;
「decode_argv」というメソッドを、@ARGVを受け取る前に書いておけば、適切なエンコーディングでデコードしてくれます。
僕はWindowsもMacもお仕事で使うので、Encode::Localeモジュールさんにはいつもお世話になっています。