12911


全角英数字と全角スペースを半角に変換したく`Moji`を使ってみたのですが  
<http://gimite.net/gimite/rubymess/moji.html>

全角スペースも対応させるための適切な文字種分類が見つけられませんでした。

全角英数字に関しては

[code]

    Moji.zen_to_han(str, Moji.ALNUM)
    
[/code]

で期待通りの変換が行えています。`Moji.SYMBOL`では長音記号`ー`などまで半角化されてしまうため

[code]

    Moji.zen_to_han(str, Moji.ALNUM).gsub("　"," ")
    
[/code]

で全角スペースを半角スペースに変換していますが、せっかく全角半角の変換ためのGemを使っているのに二度手間のような気がします。

もっと良い対応方法はあるでしょうか？


CC BY-SA 3.0
2015-07-31T20:35:29.280
12894
2015-08-01T07:12:36.583
3271
question
ruby
全角英数字及び空白文字を半角に変換する方法


ライブラリを使うと便利ですが、細かい動きを制御しようと思うととたんに面倒くさくなったりします。  
（Railsを使うときに「レール」にちゃんと乗らないと実装が複雑になるのも同じですね。）  
ご質問の件も「全角英数字と全角スペースだけを半角変換したい」というのがユースケースとしてやや特殊なので、ライブラリにどうにかしてほしいと願うのはちょっと厳しそうです。

こちらのページに Moji を使わずにRubyだけで変更する方法が載っていました。

<http://qiita.com/y-ken/items/17181f322d0413edd3dc#comment-0e29423fc28020a63133>

これを参考にするとこんなふうに実装できます。

[code]

    require 'minitest/autorun'
    
    def zen_to_han(str)
      str.tr("０-９Ａ-Ｚａ-ｚ　", "0-9A-Za-z ")
    end
    
    class ZenToHanTest < Minitest::Test
      def test_zen_to_han
        assert_equal "ABCabc 123", zen_to_han("ＡＢＣａｂｃ　１２３")
        assert_equal "あいうえお123－456", zen_to_han("あいうえお１２３－４５６")
      end
    end
    
[/code]

これであれば比較的自由に全角半角変換のルールを制御することができます。  
`Moji.zen_to_han(str, Moji.ALNUM).gsub(" "," ")`
と比べてシンプルかどうかは微妙かもしれませんが、変換の自由度が高くなるというメリットはあるかなと思います。


CC BY-SA 3.0
2015-08-01T07:12:36.583
12911
2015-08-01T07:12:36.583
85
12894
answer