Memoize

BasicWerk   EC Support   Technique   Facebook  

20140818110423_ruby_file_encoding_windows_to_unix

ruby_file_encoding_windows_to_unix

 

Windows のファイル(Shift_JIS, CRLF)を受け取って、Mac OS X 環境用に UTF-8, LF に変換する Ruby コード。

tou.rb
 
#! /usr/bin/ruby
# coding: utf-8
 
require 'kconv'
ARGV.each do |file|
    dname = File.dirname file
    bname = File.basename file
    out = "#{dname}/UTF8_#{bname}"
    puts "#{file}\t-> #{out}"
    File.open(out, "w") do |o|
        File.open(file).each do |line|
            l = NKF.nkf("-Swx", line)
            if l[-1] == "\n"
                o.puts l.chomp
            else
                o.print l
            end
        end
    end
end
 

 

まず kconv は NKF ライブラリの上に築かれている。

はじめは、kconv#toutf8 メソッドを使ったのだが、time で処理速度を計ってみたら、NKF.nkf("-Swx", line) の方が速かった。

-Swx の意味は、「Windows Shift_JIS の文字列を入力に取り(S)、UTF-8 で書きだす(w)。なお、半角カタカナは全角に変換しない(x)。」である。

ただし、改行コードについて NKF.nkf("-Swx --unix", line) とするとなぜか凄く重く(遅く)なってしまったので、CRLF から LF に変換するところは地道にif 式で振り分けてる。

ちなみに受け側が Mac(UNIX) + UTF-8 なので、ソースコードの中で指定した "\n" は LF になる。

また、chomp メソッドは文字列の改行文字が CRLF("\r\n") でも纏めて削除してくれる。

 

上のスクリプトは、ファイルを読み込んで、ファイル名に UTF8_ という prefix を付けて保存する(File.direname, File.basename を使ってる部分)。

 

実行するとこんな感じ。

 
% nkf --guess sjis_file.csv
Shift_JIS (CRLF)
 
% tou.rb sjis_file.csv 
sjis_file.csv	-> ./UTF8_sjis_file.csv
 
% nkf --guess ./UTF8_sjis_file.csv
UTF-8 (LF)
 

 

参考までに、UTF-8, LF から Shift_JIS, CRLF へ変換する Ruby スクリプトも載せておく。

tos.rb
 
#! /usr/bin/ruby
# coding: utf-8
 
require 'kconv'
ARGV.each do |file|
    dname = File.dirname file
    bname = File.basename file
    out = "#{dname}/Shift_JIS_#{bname}"
    puts "#{file}\t-> #{out}"
    File.open(out, "w") do |o|
        File.open(file).each do |line|
            l = ""
            if line[-1] == "\n"
                l = "#{line.chomp}\r\n"
            else
                l = line
            end
            o.print  NKF.nkf("-Wsx", l)
        end
    end
end
 

 

改行文字の処理周りが少し違うが基本は一緒。

 


© Shin Nakamura/BasicWerk 2014