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