日本語ファイルの入出力

ファイルを開く

  • use openで指定するか、3つの引数を取るopen()を使うか。
  • use openで指定した時は、必ず2つの引数のopen()を使う。でないと、上書きされる。

use open

 use open IN => ':utf8';
 open my $in, '<utf.txt' or die;
 use open IN => ':encoding(euc-jp)';
 open my $in, '<euc.txt' or die;

3つの引数を取るopen()

 open IN, "<:encoding(euc-jp)", "euc.txt";
 open IN, "<:utf8", "utf.txt";

ファイルに書き出す

  • 書き出す文字列($text)はUTF8フラグを落としていないと、Perlがwarningを出す。
  • (ただし、ファイルにはUTFな文字列がちゃんと書き込まれている。)
  • 従って、UTFで出力したい場合でも、下のいずれかの方法でUTFフラグを落としてやる必要がある。
  • 書き出す文字列にUTF8フラグがない場合は、何もする必要はない。

use open

 use open OUT => ':encoding(shift_jis)';
 open my $out, '>sjis.txt' or die;
 print $out $text;

3つの引数を取るopen()

 open my $out, '>:encoding(shift_jis)', 'sjis.txt' or die;
 print $out $text;

すでに開かれているファイルハンドル(STDIN/STDOUTを含む)にPerlIOレイヤを指定する(binmode)

すでに開かれているファイルハンドル(STDIN/STDOUTを含む)にPerlIOレイヤを指定する。ファイルハンドルレベルでuft8フラグを付けたり落としたり、文字コードを変換する。

use UTF8なスクリプト内で標準入力(出力)を使う

 use utf8;
 binmode STDOUT, ':utf8'; # 'encoding(utf8)'でもよい
 print "あ 京\n";

↑binmodeを使わなければ「Wide character」のシステムエラーが発生する。

 use utf8;
 binmode STDIN, ':utf8';
 while (<>) {
    chomp;
    print "[$_]\n";
 }

use utf8なスクリプト内で、SJISのテキストファイルを読取り、標準出力へ表示する

 use utf8;
 binmode STDOUT, ':encoding(utf8)';
 open my $fh, '<', shift;
 binmode $fh, ':encoding(sjis)';
 while ($row = <$fh>) {
    print $row;
 }
 close $fh;

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS