Encodeモジュールを利用して、入力ファイルの文字コードを変更する方法です。
実際に利用するには、入力ファイルや出力ファイルのファイル名を変更し、decode関数やencode関数の文字コードを変換します。
# encode.pl # 内容 : utf8形式のデータを読み込んでshift_jisで出力する # Copyright (c) 2011 Mitsuo Minagawa, All rights reserved. # (minagawa@fb3.so-net.ne.jp) # 使用方法 : c:\>perl encode.pl # use Encode; open(IN1,"input.txt"); open(OUT1,">output.txt"); while ($line1 = <IN1>) { # 入力ファイルからの文字コードの変換は、入力ファイルの文字コードを指定して、 # Encode::decode 関数で行う。 # 下記の例ではutf8のファイルをshift-jisに変換している。 # 文字コードは、uft8 以外に、shiftjis や euc-jp が指定できる。 # 入力ファイルで uft8 を指定する場合は 「BOMなし」を前提とする。 $line1 = decode('utf8', $line1); # 出力ファイルへの文字コードの変換は、出力ファイルの文字コードを指定して、 # Encode::encode 関数で行う。 # 文字コードは、shiftjis 以外に、uft8 や euc-jp が指定できる。 $line1 = encode('shiftjis', $line1); print OUT1 $line1; } close(IN1); close(OUT1);
それでは、1つずつ解説していきましょう。
# 入力ファイルからの文字コードの変換は、入力ファイルの文字コードを指定して、 # Encode::decode 関数で行う。 # 下記の例ではutf8のファイルをshift-jisに変換している。 # 文字コードは、uft8 以外に、shiftjis や euc-jp が指定できる。 # 入力ファイルで uft8 を指定する場合は 「BOMなし」を前提とする。 $line1 = decode('utf8', $line1);
入力ファイルの文字コードを変換するには、まず、decode関数の文字コードを入力ファイルの文字コードにあわせて変更します。decode関数は「decode('変換前の文字列の文字コード' , 変換する文字列)」で指定します。文字コードについては、下記を参照してください。Windowsでshift_jisを使っている場合は、「cp932」を使うと、変換エラーが発生しにくくなります。
encode関数やdecode関数の文字コード
文字コード | 内 容 |
utf8 | unicodeを表す文字コードの一種。Perl5.8以降、Perlの内部では、文字列はutf8で扱われています。 |
euc-jp | 主にUNIXなどで利用されている文字コード。eucjp,ujis,jp-eucなどと指定しても可 |
shift_jis | 主にWindowsで利用されている文字コード。shiftjis,sjisなどと指定しても可 |
cp932 | 主にWindowsで利用されている文字コード。shift_jisに機種依存文字を含んだもの。一般にはshift_jisと指定するよりは、こちらで指定した方が変換エラーは発生しにくくなります。windows-31jと指定しても可 |
7bit-jis | ASCII文字が割り当てられているコードに、半角カタカナを割り当て、エスケープシーケンス等によって、半角カタカナモードに切り替えるものです。 bjisと指定しても可 |
iso-2022-jp | いわゆる「JIS漢字コード」です。 |
iso-2022-jp-1 | いわゆる「JIS漢字コード」に「JIS補助漢字」を追加したものです。 |
MacJapanese | shift_jisにAppleコンピュータ用の機種依存文字を含んだものです。 |
# 出力ファイルへの文字コードの変換は、出力ファイルの文字コードを指定して、 # Encode::encode 関数で行う。 # 文字コードは、shiftjis 以外に、uft8 や euc-jp が指定できる。 $line1 = encode('shiftjis', $line1); print OUT1 $line1;
出力ファイルの文字コードを変換するには、まず、encode関数の文字コードを入力ファイルの文字コードにあわせて変更します。encode関数は「encode('変換後の文字列の文字コード' , 変換する文字列)」で指定します。文字コードについては、上記の表を参照してください。
さらに、from_to関数を使うと、decode関数とencode関数の2つの関数を使って行う文字コードの変換を一度に行うことができます。この場合、Encode::from_to(変換する文字列,変換前の文字コード,変換後の文字コード)と指定します。Encode::from_to関数は変換する文字列を直接変換後の文字コードに変換しますので、$temp = Encode::from_to(変換する文字列,変換前の文字コード,変換後の文字コード)のような形で他に代入する必要はありません。
Encode::from_to($line1, 'utf8', 'shiftjis');
その他注意すべきこと
フォルダ内の複数のファイルについて一括して文字コードを変換する場合は、[3-3-1.フォルダ内のファイル名を出力する]でフォルダ内のファイル名をファイルに出力した後、[3-3-3.フォルダ内のファイルについて一括変更をする]と上記のスクリプトを参照して、スクリプトを作成します。
ここでは、"filename.txt"には文字コードがshift_jisになっている拡張子がhtmlのファイル名が入っているものとし、フォルダ内にある複数のshift_jisのhtmlファイルをutf-8に変換する場合のサンプルを挙げます(ただし、フォルダ名やファイル名に全角文字が含まれていると、正常にファイルをopenすることができませんので、注意してください。全角文字がフォルダ名やファイル名に含まれている場合は、ドライブ名から指定する絶対的なパスではなく、相対的なパスに変更して、フォルダ名に全角文字が入らないようにしたり、フォルダ名やファイル名を変更しておく必要があります。相対的なパスについては[2-1-4.スクリプトと入出力ファイルを異なるフォルダに入れる]を参照してください。)。
# encode2.pl # 内容 : フォルダ内のファイルについてshift_jisからutf-8に変更する # Copyright (c) 2013 Mitsuo Minagawa, All rights reserved. # (minagawa@fb3.so-net.ne.jp) # 使用方法 : c:\>perl encode2.pl # use Encode; open(IN1,"filename.txt"); while ($filename = <IN1>) { chomp($filename); open(IN2,"$filename"); # ファイル名をもとに全データを読み込む @data = <IN2>; foreach $line (@data) { $line = decode('cp932', $line); $line =~ s/charset=shift_jis/charset=UTF-8/g; $line = encode('utf8', $line); } # 読み込んだファイルを出力ファイルとして、openし直す open(OUT1,">$filename"); # 変更した内容を出力する foreach $line (@data) { print OUT1 $line; } } close(IN1); close(IN2);