■Windows版Perlの細道・けもの道

■ナビゲータ

[南北館(最初のメニュー)]

  1. [Windows版Perlの細道・けもの道]
    1. [1.準備編]
    2. [2.基本編]
    3. [3.応用編]
      1. [3-1.固定長データとCSVデータとの変換]
      2. [3-2.重複データの処理]
      3. [3-3.フォルダ内の一括処理]
      4. [3-4.1つのファイルを複数のファイルに分割する]
      5. [3-5.文字コードの変換]
        1. [3-5-1.文字コードの変換(Encodeモジュール利用)]
        2. [3-5-2.文字コードの変換(perl IO レイヤ使用)]
        3. [3-5-3.文字コードの変換(open プラグマ 使用)]
      6. [3-6.半角全角変換]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
    4. [スクリプトと入力データのサンプル]
rubyではどう処理する?
同じことをrubyではこうしています。

3.応用編

3-5.文字コードの変換

3-5-1.文字コードの変換(Encodeモジュール利用)

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

   
【スクリプトとデータのサンプル】

スクリプトはこちらにあります。




Copyright (c) 2011-2013 Mitsuo Minagawa, All rights reserved.