ファイルの読み書きに使用する文字コードを指定する

ファイルからテキストデータを読み込むときやファイルへテキストデータを書き込むときに、ファイルで使う文字コードを指定する必要があります。ここでは Perl のプログラムでファイルの読み書きをするときの文字コードを指定する方法について解説します。

(Last modified: )

openプラグマを使って文字コードを指定する

ファイルからテキストデータを読み込む場合には、ファイルの文字コードを Perl の内部的な文字コードに変換する必要があります。またファイルへテキストデータを書き出す場合は Perl の内部的な文字コードからファイルで使用する文字コードへ変換する必要があります。

入出力に関する文字コードを設定する方法としては、すべての入出力に対してまとめて指定する方法と、 open 関数を使用する時に個別に指定する方法があります。

まずはすべての入力、すべての出力、又はすべての入出力に対してまとめて文字コード指定する方法を確認します。 open プラグマを使います。

use open IN  => ":utf8";
use open OUT => ":utf8";
use open IO => ":utf8";
use open IN  => ":encoding(文字コード)";
use open OUT => ":encoding(文字コード)";
use open IO => ":encoding(文字コード)";

use open IN は入力の文字コードを、 use open OUT は出力の文字コードを、 use open IO は入出力の文字コードを指定します。

文字コードの指定方法は、 UTF-8 の場合は :utf8 と記述し、 UTF-8 以外の場合は :encoding(文字コード) と記述します。例えば encoding(euc-jp)encoding(cp932) などです。

use open IN => ":utf8";
use open OUT => ":encoding(cp932)";

また入出力をまとめて指定する場合は次のように記述することも可能です。

use open IO ":utf8";
use open IO ":encoding(cp932)";

入力の対象となるファイルや、出力の対象となるファイルが同じ文字コードとなっている場合はこの記述方法を使用して下さい。

open関数の引数に文字コードを指定する

個々のファイルを開くときに文字コードを設定する方法です。 open 関数の 3 つの引数を指定する書式を使います。

open(ファイルハンドル名, "モード:文字コード", "ファイル名");

モードを指定する時に合わせて文字コードを指定します。文字コードの指定方法は open プラグマの時と同じく UTF-8 の場合は utf8 と記述し、それ以外の場合は encoding(文字コード) と記述します。

例えば次のように記述します。

open(DATAFILE, "<:utf8", "datain.txt");
open(DATAFILE, ">:encoding(cp932)", "dataout.txt");

この場合 datain.txt を読み込みで開く時に文字コードを UTF-8 に設定し、 dataout.txt を書き込みで開く時に文字コードを cp932 に設定します。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

open(DATAFILE, "<:utf8", "data.txt") or die("Error:$!");

while(my $line = <DATAFILE>){
  chomp($line);
  print "$line\n";
}

close(DATAFILE);

open(DATAFILE, ">:encoding(cp932)", "data_cp932.txt") or die("Error:$!");

print DATAFILE "クッキー\n";
print DATAFILE "チョコレート\n";
print DATAFILE "ビスケット\n";

close(DATAFILE);

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

あらかじめ sample.pl と同じディレクトリに data.txt というファイルを作成しておきました(文字コードは UTF-8 です)。ファイルには次のようなテキストデータを入力してあります。

ファイルの読み書きに使用する文字コードを指定する(1)

次のように実行結果が表示されます。

ファイルの読み書きに使用する文字コードを指定する(2)

文字コードとして UTF-8 で保存された data.txt ファイルを読み込み画面に表示しました。また data_cp932.txt という名前のファイルを新規に作成し、文字コードとして cp932 を使ってファイルにテキストデータを書き込みました。プログラムの実行後に data_cp932.txt ファイルを開いてみると次のように表示されます。

ファイルの読み書きに使用する文字コードを指定する(3)

文字コードとして cp932 を使って書き込まれているのが確認できます。

-- --

Perl のプログラムでファイルの読み書きをするときの文字コードを指定する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。