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

■ナビゲータ

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

  1. [Windows版Rubyの細道・けもの道]
    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.文字コードの変換(kconvライブラリ利用)]
        2. [3-5-2.文字コードの変換(nkfライブラリ利用)]
        3. [3-5-3.文字コードの変換(encode利用)]
        4. [3-5-4.外部エンコーディングと内部エンコーディングによる変換]
      6. [3-6.半角全角変換]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
    4. [スクリプトと入力データのサンプル]
Perlではどう処理する?
同じことをPerlではこうしています。

3.応用編

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

3-5-4.外部エンコーディングと内部エンコーディングによる変換

外部エンコーディングと内部エンコーディングを使って、文字コードを変換する方法です。

外部エンコーディングとは、入力ファイルや出力ファイルなどに使用している文字コードの種類を表します。これに対し、内部エンコーディングとは、スクリプトに取り込んだ後の文字コードの種類を表します。外部エンコーディングと内部エンコーディングとは同じにすることもできますが、異なるエンコーディングにすることもできます。

openメソッドには2つの引数があり、第1の引数は「ファイル名」、第2の引数は「入出力を表すファイルのモード(入力は"r"、出力は"w"など):外部エンコーディング:内部エンコーディング」と指定します。

単に入力ファイルから出力ファイルに文字コードを変換するだけであれば、内部エンコーディングは不要ですが、スクリプト内でパターンマッチ処理などを行うために、漢字などを指定する場合には、内部エンコーディングを設定するとともに、ruby1.8以前であれば、$KCODEを指定し、ruby1.9以降の場合は、マジックコメントを指定すると、漢字を使ったパターンマッチ処理ができるようになります。$KCODEやマジックコメントについては、[2-1-5.スクリプトの中で漢字を使う]を参照してください。

外部エンコーディングと内部エンコーディングの文字コード

文字コード 内    容
"shift_jis" 入力ファイルやスクリプトの文字コードがshift_jisの場合に指定する。
"euc-jp" 入力ファイルやスクリプトの文字コードがEUC-JPの場合に指定する。
"utf-8" 入力ファイルやスクリプトの文字コードがutf-8の場合に指定する。

以下の例では、マジックコメントと内部エンコーディングを指定して、パターンマッチ処理を行えるようにしたものです。実際に応用する場合は、入出力データのファイル名等を変更して、利用します。

【スクリプト】
# coding:utf-8  
# encoding.rb   
# 内容 :外部エンコーディングと内部エンコーディングとの使用例    
# 前提 :スクリプトはutf-8、入出力ファイルはshift_jis    
# Copyright (c) 2011-2015 Mitsuo Minagawa, All rights reserved. 
# (minagawa@fb3.so-net.ne.jp)   
# 使用方法 : c:\>ruby encoding.rb   

# 入力ファイルはshift_jis、内部の文字コードはutf-8  
in1_file    =   open("input_sjis.txt","r:shift_jis:utf-8")  
# 出力ファイルはshift_jis、内部の文字コードはutf-8  
# (内部の文字コードはutf-8からshift_jisに変換して出力する)  
out1_file   =   open("output.txt","w:shift_jis:utf-8")  

# 主処理    
while   (line1  =   in1_file.gets)  
    line1.chomp!    
#タブ区切りのとき   
#               in1     =   line1.split("\t",-1)    
#カンマ区切りのとき 
    in1 =   (line1 + ',')   
            .scan(/"([^"\\]*(?:\\.[^"\\]*)*)",|([^,]*),/)   
            .collect{|x,y| y || x.gsub(/(.)/, '\1')}    

    if      (/表/   =~  in1[2]) 
            in1[1]      =   "XYZ"   
    elsif       (/機/   =~  in1[2]) 
            in1[1]      =   "PQR"   
    end 

    out1    =   in1.join("\t")  
    out1_file.print out1,"\n"   
end     

# ファイルのクローズ    
in1_file.close  
out1_file.close 
    
【スクリプトとデータのサンプル】

スクリプトはこちらにあります(必ずutf-8で保存してください)。

入力データはこちらにあります(必ずshift_jisで保存してください)。

【入力データ】
"0100","ABC","[]@!#$%&<>'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ"  
"0110","ABC","[]@!#$%&<>'()*+,-./ " 
"0120","ABC","0123456789"   
"0130","ABC","ABCEFGabcefg" 
"0140","ABC","アイウエオガザダバパヴ"    
"0150","ABC","カガ タダヒコ"    
"0160","ABC","スズキ ココロ" 
"0170","ABC","ジョン・スミス" 
"0200","DEF","[]@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ"
"0210","DEF","[]@!#$%&'()*+,−./ "
"0220","DEF","0123456789"
"0230","DEF","ABCDEFGabcdefg"
"0240","DEF","アイウエオガザダバパヴ"
"0250","DEF","カガ タダヒコ"
"0260","DEF","スズキ ココロ"
"0270","DEF","ジョン・スミス"
"0280","DEF","貸借対照表"
"0290","DEF","航空機部品"
    
【出力データ】
0100    ABC []@!#$%&'()*+,-./ 012345ABCEFGabcefgアイウエオガザダバパヴ 
0110    ABC []@!#$%&'()*+,-./   
0120    ABC 0123456789  
0130    ABC ABCEFGabcefg    
0140    ABC アイウエオガザダバパヴ 
0150    ABC カガ タダヒコ   
0160    ABC スズキ ココロ  
0170    ABC ジョン・スミス    
0200    DEF []@!#$%&'()*+,−./012345ABCDEFGabcdefgアイウエオガザダバパヴ  
0210    DEF []@!#$%&'()*+,−./     
0220    DEF 0123456789  
0230    DEF ABCDEFGabcdefg  
0240    DEF アイウエオガザダバパヴ   
0250    DEF カガ タダヒコ   
0260    DEF スズキ ココロ   
0270    DEF ジョン・スミス   
0280    XYZ 貸借対照表
0290    PQR 航空機部品
    



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