nkfライブラリを使って、文字コードを変換する方法です。
文字コードを変換するだけでなく、半角カタカナを全角カタカナに変換するなど、さまざまな機能があります。nkfライブラリのオプションは以下の通りです。各々のオプションはスペースを空けて、-S -s のように個別に記入することができますが、まとめて、-Ss と記入することもできます。
入力ファイルの文字コードに関するオプション
| オプション | 内 容 |
| -S | 入力ファイルの文字コードをshift_jisとする。 |
| -E | 入力ファイルの文字コードをEUC-JPとする。 |
| -J | 入力ファイルの文字コードをISO-2022-JP(いわゆるjisコード)とする。 |
| -W | 入力ファイルの文字コードをUTF-8(BOMなし)とする(-W80とおなじ)。 |
| -W8 | 入力ファイルの文字コードをUTF-8(BOMあり)とする。 |
| -W80 | 入力ファイルの文字コードをUTF-8(BOMなし)とする(-Wとおなじ)。 |
| -W16 | 入力ファイルの文字コードをUTF-16(Big Endian/BOMなし)とする(-W16B0とおなじ)。 |
| -W16B | 入力ファイルの文字コードをUTF-16(Big Endian/BOMあり)とする。 |
| -W16B0 | 入力ファイルの文字コードをUTF-16(Big Endian/BOMなし)とする(-W16とおなじ)。 |
| -W16L | 入力ファイルの文字コードをUTF-16(Little Endian/BOMあり)とする。 |
| -W16L0 | 入力ファイルの文字コードをUTF-16(Little Endian/BOMなし)とする。 |
Big Endianとは「データの上位バイトからメモリに並べる方式」のことで、Little Endianとは「データの下位バイトからメモリに並べる方式」のことです。
CPUでは、SunのSPARC、Motorolaの68K、コンピュータでは、IBM系の汎用機やMacintosh等が「ビッグエンディアン(Big Endian)」を採用しているのに対し、CPUでは、インテルのx86系、コンピュータでは、Windows等が「リトルエンディアン(Little Endian)」を採用しています。
出力ファイルの文字コードに関するオプション
| オプション | 内 容 |
| -s | 出力ファイルの文字コードをshift_jisとする。 |
| -e | 出力ファイルの文字コードをEUC-JPとする。 |
| -j | 出力ファイルの文字コードをISO-2022-JP(いわゆるjisコード)とする。 |
| -w | 出力ファイルの文字コードをUTF-8(BOMなし)とする(-W80とおなじ)。 |
| -w8 | 出力ファイルの文字コードをUTF-8(BOMあり)とする。 |
| -w80 | 出力ファイルの文字コードをUTF-8(BOMなし)とする(-Wとおなじ)。 |
| -w16 | 出力ファイルの文字コードをUTF-16(Big Endian/BOMなし)とする(-W16B0とおなじ)。 |
| -w16B | 出力ファイルの文字コードをUTF-16(Big Endian/BOMあり)とする。 |
| -w16B0 | 出力ファイルの文字コードをUTF-16(Big Endian/BOMなし)とする(-W16とおなじ)。 |
| -w16L | 出力ファイルの文字コードをUTF-16(Little Endian/BOMあり)とする。 |
| -w16L0 | 出力ファイルの文字コードをUTF-16(Little Endian/BOMなし)とする。 |
その他のオプション
| オプション | 内 容 |
| -Lu | Unix系で使われる改行コード(LF)に変換します(-dとしても可)。 |
| -Lw | Windowsで使われる改行コード(CRLF)に変換します(-cとしても可)。 |
| -Lm | Macintoshで使われる改行コード(CR)に変換します。 |
| -m0 | MIME(電子メール用のフォーマット)に変換しない(nkfはこのオプションを指定しない限り、MIMEに変換する処理を行う)。 |
| -x | 半角カタカナを全角カタカナに変換しない(nkfはこのオプションを指定しない限り、全角カタカナに変換する処理を行う)。 |
| --cp932 | Windows の機種依存文字(〜−¢£¬|など)をUnicodeに変換するときに文字化けしないようにする。 |
| -h1 | 全角カタカナをひらがなに変換する。 |
| -h2 | ひらがなを全角カタカナに変換する。 |
| -h3 | 全角カタカナをひらがなに変換し、ひらがなを全角カタカナに変換する。 |
| -f | 禁則処理をほどこした折り返しを行う。 たとえば、-f80とすると、半角80文字で折り返しを行う。禁則処理を半角10文字までの範囲でぶら下げ、それ以上は強制的に改行するが、-f80-5とすると、強制改行を行う余地を半角5文字とすることができる。したがって、-f80-0とすると、禁則処理を行わなくなる(改行がすべて半角空白に置き換えられる点が-Fと異なる)。 |
| -F | 禁則処理をほどこした折り返しを行う。 たとえば、-F80とすると、半角80文字で折り返しを行う。禁則処理を半角10文字までの範囲でぶら下げ、それ以上は強制的に改行するが、-F80-5とすると、強制改行を行う余地を半角5文字とすることができる。したがって、-F80-0とすると、禁則処理を行わなくなる(改行がそのまま保存される点が-fと異なる)。 |
| -Z0 | 全角スペースは変換せず、全角英数字と記号とは半角英数字と記号とに変換する。 |
| -Z1 | 全角スペースを半角スペース1個に変換する。 |
| -Z2 | 全角スペースを半角スペース2個に変換する。 |
| -Z3 | 半角の>,<,”,&、を '>', '<', '"', '&' に変換する |
| -Z4 | 全角カタカナを半角カタカナ変換する。 |
実際に応用する場合は、入出力データのファイル名等を変更して、利用します。
# nkfconv.rb
# 内容 : 入力コード(エンコード)変換と半角カタカナを全角カタカナに変換する
# Copyright (c) 2011-2015 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>ruby nkfconv.rb
#
require 'nkf'
# 入力ファイル
in1_file = open("input_sjis.txt","r")
# 出力ファイル
out1_file = open("output_utf8.txt","w")
# 主処理
while (line1 = in1_file.gets)
line1.chomp!
#タブ区切りのとき
# in1 = line1.split("\t",-1)
#カンマ区切りのとき
in1 = (line1 + ',')
.scan(/"([^"\\]*(?:\\.[^"\\]*)*)",|([^,]*),/)
.collect{|x,y| y || x.gsub(/(.)/, '\1')}
#入力ファイルの文字コードがshift_jis,出力ファイルはutf8,MIME 文字列をデコードしない
in1[2] = NKF::nkf( '-Swm0', in1[2] )
out1 = in1.join("\t")
out1_file.print out1,"\n"
end
# ファイルのクローズ
in1_file.close
out1_file.close
スクリプトはこちらにあります(必ずshift_jisで保存してください)。
入力データはこちらにあります(必ず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 DEF 貸借対照表
0290 DEF 航空機部品