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 コマンドにお任せしました。
他もかなりベタベタなプログラムになってしまいましたが、ひとまずこれ
で良しとます。もっと良い書き方があればツッコミお願いします。