半角英数文字を全角にしたい

viewsで作成されたフォームに「全角で入力してね」と表記していても半角で入力される。そんなユーザーは「そんくらいなんとかしてよ」とか言うに決まっている。
 
やってみると難しい。
まず、入力された値はutf8のはずなんだけど

pp NKF.guess(str)
> 5

判定出来ないらしい。
 
この状態で

str.tr("A-Z0-9","A-Z0-9")

ってやっても文字化けする。
 
入力されるであろう文字列が想定されているなら、無理矢理を行ってみる。

han_str = %w(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9)
zen_str = %w(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z  
0 1 2 3 4 5 6 7 8 9)

    upmoji=""
    chk_str.split(//).each{|moji|
      han_str.each_with_index{|elem, j|
        upmoji << zen_str[j] if elem == moji
      }
    }
    chk_str = upmoji

ちょー強引だ。エラー処理とか考えていないし、エレガントじゃない。