文字コードについておさらい
ここで1回、「文字コード」についておさらいしておきましょう。文字コードとは、文字を電子ファイルに保存する時に「『あ』は『01』、『い』は『02』という番号に変換して保存しておきましょう。」などとあらかじめ取り決めてある変換ルールの事です。偉い方々が話し合って決めます。
日本語で使われる主な文字コードは「UTF-8」、「Shift_JIS」、「ISO-2022-JP」、「EUC-JP」の4つがあります。変換ルールが一方では「『あ』は『01』」、別のルールでは「『あ』は『101』」など、それぞれ異なりますので、ファイルがどのルールで保存されているかが分かっていないと開いた時に文字化けしてしまうのです。
4つの文字コードはそれぞれ歴史がありよく使われる場面が異なるのですが、現在、プログラミングについては「UTF-8」を使うのが主流です。この一連の記事でも、プログラムは UTF-8 で書く事を想定しています。
一方、Windows や Mac でメモなどを書いて保存した場合、通常は「Shift_JIS」で保存されます。
Perl の文字コード変換機能
Perl では、プログラムが書かれている文字コードは UTF-8 である、と想定しています。また、入力するファイルは、何も指定していなければアルファベットや記号 (いわゆる ASCII 文字) だけで書かれていると思い込んで処理してしまいます。先ほどの文字化けは、ファイルの中身がアルファベットだと思い込んで読み込んだからなのです。これでは英語以外の言語のファイルが読み取れず困りますので、Perl には「入力はこの文字コードで行う」「出力はこの文字コードで行う」と指定する機能があります。これを指定しておくと、入出力の際は自動的に UTF-8 との相互変換を行ってくれます。
サンプルのプログラムではずっと、おまじないとして以下の1行を付けて下さいとお願いしていましたが、これも画面出力の文字コードを変換するように指定しているのです。
binmode STDOUT, 'encoding(utf8)'; #Windows の場合は utf8 -> cp932
Perl の文字コード変換機能
ファイル入力時の文字コード指定
では、ファイル入力のプログラムに戻りましょう。入力するファイルの文字コードを指定するには、open と書いてある行に文字コードの指定を足します。open ($fh, '<:encoding(cp932)', 'text01.txt') or die "ERROR: open: text01.txt: $!\n" ;さあこれで、やっと以下のように出力されましたね。
% perl file-io.pl サンプル ianadam aweaman uraedoken awiahagawもしまだ文字化けする方は、追加した「:encoding(cp932)」部分を「:encoding(utf8)」に変更してみて下さい。
では、順に、プログラムの中身を説明します。
>次は:ファイルを開く open コマンド