ruby の NKF モジュールは、コマンドの nkf と比べてなぜか guess の精
度が低いです。例えば、以下の文字列を EUC-JP として保存し評価すると
NKF モジュールは ASCII、nkf コマンドは EUC-JP という結果になります。
ruby のバージョンは 1.8.7-p72 です。

aaaaaaaaaaaaaaaaaaaaaaaa
テストテスト。

仕方がないので、nkf コマンドがある時は nkf コマンドを、なければ
NKF モジュールを使って文字コードを推測するサンプルコードを書きました。

#!/usr/bin/env ruby

STR = <<EOF
aaaaaaaaaaaaaaaaaaaaaaaa
テストテスト。
EOF

TMPFILE = "#{File.basename($0)}.tmp.#{$$}"

result = ""

File.open(TMPFILE, "w") do |f|
  f.write(STR)
end

if /mswin32/ =~ RUBY_PLATFORM
  result = `type #{TMPFILE} | nkf --guess 2> nul`
else
  result = `sh -c 'cat #{TMPFILE} | nkf --guess 2> /dev/null'`
end

File.delete(TMPFILE)

if $?.to_i != 0
  require 'nkf'

  CODES = {
    NKF::JIS      => "JIS",
    NKF::EUC      => "EUC-JP",
    NKF::SJIS     => "SJIS",
    NKF::BINARY   => "BINARY",
    NKF::UNKNOWN  => "UNKNOWN(ASCII)",
    NKF::ASCII    => "ASCII",
    NKF::UTF8     => "UTF8",
    NKF::UTF16    => "UTF16",
  }

  result = CODES[NKF.guess(STR)]
end

printf("%s\n", result.chomp)

このプログラムの用途は、自作の SMTP 送信ツールの文字コード推測の部
分です。

UNIX の場合、ログインシェルが csh 系と sh 系とでエラー処理の方法が
違うので、sh コマンドにお任せしました。

他もかなりベタベタなプログラムになってしまいましたが、ひとまずこれ
で良しとます。もっと良い書き方があればツッコミお願いします。