■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-2.文字コードの変換(nkfライブラリ利用)

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 航空機部品
    



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