[Ruby] 文字コードの判別
memo.
NKF.guess で判別するのかなー?
漢字コード判別コマンドの例が載っている。
#!/usr/local/bin/ruby
require 'nkf'
CODES = {
NKF::JIS => "JIS",
NKF::EUC => "EUC",
NKF::SJIS => "SJIS",
NKF::UTF8 => "UTF8",
NKF::BINARY => "BINARY",
NKF::ASCII => "ASCII",
NKF::UNKNOWN => "UNKNOWN",
}
while file = ARGV.shift
str = open(file) {|io| io.gets(nil) }
printf "%-10s ", file
if str.nil?
puts "EMPTY"
else
puts CODES.fetch(NKF.guess(str))
end
end
NKF.#guess
は、漢字コードを推測して返す。
CSVファイルを読み込んで判別して処理して欲しい。
書いてみる。
require 'optparse'
# require 'kconv'
require 'nkf'
require 'csv'
require 'pp'
#読み込んだファイルの文字コード表示用配列
CODES = {
NKF::JIS => 'JIS',
NKF::EUC => 'EUC',
NKF::SJIS => 'SJIS',
NKF::UTF8 => 'UTF-8',
NKF::UTF16 => 'UTF-16',
NKF::BINARY => 'BINARY',
NKF::ASCII => 'ASCII',
NKF::UNKNOWN => 'UNKNOWN',
}
begin
OPTS = ARGV.getopts('')
path_to_csv = ARGV[0]
f = open(path_to_csv, 'r')
contents = f.read
f.close
rescue => ex
puts "Error: #{ex}"
exit
end
begin
case CODES[NKF.guess(contents)]
when 'UTF-8'
csv = CSV.read(path_to_csv, headers: true, encoding: 'UTF-8:UTF-8').map(&:to_hash)
when 'SJIS'
csv = CSV.read(path_to_csv, headers: true, encoding: 'Shift_JIS:UTF-8').map(&:to_hash)
else
puts 'UTF-8 と SJIS ファイルに対応しています。'
exit
end
rescue => ex
puts "Error: #{ex}"
end
pp csv
こんなでいいのかな?
補遺
「完全な文字コード判定というのは理論的には不可能」とのこと。
brianmario/charlock_holmes という gem で文字コードの自動判別を行う。