是非に及ばず

プログラミングに関する話題などを書いていきます(主にRailsやAndroidアプリ開発について)

Rubyで全角カタカナを半角カタカナに変換する

なぜか半角カタカナから全角カタカナにするサンプルは良く見つかるのに
全角カタカナから半角カタカナに変換するサンプルがあまり見つからないので
自分で作ってみた。
やっつけ仕事だけど、とりあえず動くので良しとしておく。

$KCODE = 'u'

class TextFilter
  @@zenkaku_kana = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ
     ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ
     ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ
     ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ
     ム メ モ ヤ ユ ヨ ラ リ ル レ
     ロ ワ ヲ ン ャ ュ ョ ァ ィ ゥ ェ ォ ッ
      ゛ ゜ ー ! ).freeze
  @@hankaku_kana = %w(ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ
     ヂ ヅ デ ド バ ビ ブ ベ ボ パ ピ プ ペ ポ ヴ ア イ
     ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ
     ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン ャ ュ
     ョ ァ ィ ゥ ェ ォ ッ ゙ ゚ ー ! ).freeze
  @@zenkaku_alnum = %w(0 1 2 3 4 5 6 7 8 9
   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).freeze
  @@hankaku_alnum = %w(0 1 2 3 4 5 6 7 8 9 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).freeze

  def self.zen_to_han(str)
    str = str.clone
    str = self.filter(str, @@zenkaku_alnum, @@hankaku_alnum)
    self.filter(str, @@zenkaku_kana, @@hankaku_kana)
  end

private
  def self.filter(str, from, to)
    str = str.clone
    from.each_with_index do |int, i|
      str.gsub!(int, to[i])
    end

    return str
  end
end

require 'nkf'
text = "アイウエオ0123456789!"
after = TextFilter.zen_to_han(text)
puts NKF.nkf('-m0 -s -x', text)
puts NKF.nkf('-m0 -s -x', after)

出力

アイウエオ0123456789!
アイウエオ0123456789!