すがブロ

sugamasaoのhatenablogだよ

OSの文字コードを取得するには

標準出力に日本語を出したい! だけど OS の文字コードによっては文字化けしちゃう><

例えば、-h のヘルプを日本語で書いたとしよう。そのヘルプを表示するとき、Windows なら SJIS で表示して欲しいし、Linux ならその端末に設定されている LANG の値で表示してほしい。
で、その為の変換自体は NKF 等でやれば良いので、問題は出力先の文字コードを知らないといけないということ。

どうすれば良いか

RUBY_PLATFORM という環境変数を見ると、プラットフォームが分かるらしい*1。強引だけど、これを見て Windows かそうでないかを判定する事にしよう。
これで Windows だったら問答無用で SJIS にする*2
それ以外は環境変数の ENV['LANG'] を見て文字コードを取得するようにしてみる。

こんな感じのメソッドを作った

def platform_lang
  lang = ""

  # Windows だったらSJIS
  if RUBY_PLATFORM =~ /mswin|mingw|cygwin|bccwin/i
    lang = "SJIS"
  elsif ENV['LANG']
    lang = "UTF-8" if ENV['LANG'] =~ /utf-8/i
    lang = "EUC" if ENV['LANG'] =~ /euc/i
    lang = "SJIS" if ENV['LANG'] =~ /sjis/i
  end

  return lang
end

puts platform_lang

すげーやっつけだけど、Windows と Mac OSX と FedoraCore7 で動作を確認できた。
実はENV['LANG']のフォーマットである、「ja_JP.UTF-8」な部分の "." 以降を取るようにしようか迷ったんだけど、eucJP とかの表記だと文字コードの表現としては使いにくいので見送った。

普通は

どうやってOSの文字コードを拾ってるんですかね?><

*1:正確に言うと Ruby がどのプラットフォーム向けにコンパイルされたか? なのかな

*2:環境変数の LANG が無かったら Windows と見なす方法でも良かったけど・・・