[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 で文字コードの自動判別を行う。