外部エンコーディングと内部エンコーディングを使って、文字コードを変換する方法です。
外部エンコーディングとは、入力ファイルや出力ファイルなどに使用している文字コードの種類を表します。これに対し、内部エンコーディングとは、スクリプトに取り込んだ後の文字コードの種類を表します。外部エンコーディングと内部エンコーディングとは同じにすることもできますが、異なるエンコーディングにすることもできます。
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 航空機部品