UTF-8 から Shift JIS に文字コードを変換する方法

目次

PerlIO レイヤを使用する方法

v5.8.0 から、標準機能として PerlIO レイヤが perl に盛り込まれました。 PerlIO レイヤとは、入出力の際にフォーマットを変換するためのフィルターの役割をする機能のことです。 例えば、あるファイルを開くときに文字コードを指定して、読み込み時に自動的に内部形式に変換する、というようなことができます。

この機能を使えば、入力ファイルの文字コードを UTF-8 とし、出力ファイルの文字コードを Shift_JIS と指定しておくだけで、入力ファイルから読み込み出力ファイルに書き出すだけで自動的に文字コードの変換ができちゃいます。

どういうときに使えるのか

PerlIO レイヤは、入出力時にフォーマットを変換するものです。 よって変数に入っている文字列 (オクテットストリング) の文字コードを変換する、という使い方ではなく、ファイルの読み書き時や標準入出力へ出力するときに使用します。

つまりは文字コードの変換を主目的とするものではないのですが、ファイルを読み込み別のファイルに書き出す、というような場合には文字コードを変換する目的にも使用できます。

例: UTF-8 で書かれたファイルを読み込み、Shift_JIS でファイルに書き出す

以下は、open 関数を使用する際に encoding レイヤ (PerlIO レイヤの一種) を指定して、自動的に文字コードの変換を行う例です。

:encoding(shift_jis)", "shiftjis.txt") or die "can't open the file...";

# 入力ファイルから 1 行ずつ読み込む.
# このとき Perl 内部では自動的に UTF-8 から内部形式になる.
while(  ) {
	# 出力ファイルへ書き出す.
	# 出力時に、自動的に内部形式から Shift_JIS に変換される.
	print OUT $_;
}

# ファイルハンドルを閉じる.
close(OUT);
close(IN);

exit(0);]]>