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);