さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

Perlで日本語を扱うときの設定

PerlのスクリプトはいつもUTF-8で書いています。

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モジュールさんにはいつもお世話になっています。