Rubyで文字化けせずに全角英数字を半角英数字に変換する方法

  • 7
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

RubyでUTF-8文字列の全角英数字の表記揺れを統一したいとき、
気をつけないと希に文字化けする事象を見つけたのでメモします。

NKFを用いて全角英数字→半角英数字に変換する方法

ググるとよく出てくる方法は次の通りです。
ここでもしWindowsの機種依存文字が混じるとどうなるでしょうか?

$ pry
pry(main)> require 'nkf'
=> true
pry(main)> NKF.nkf('-m0Z1 -w', "Ruby−2.2")
=> "Ruby-2.2"
pry(main)> NKF.nkf('-m0Z1 -w', "ルビー Ⅱ")
=> "ルビー Ⅱ"
pry(main)> NKF.nkf('-m0Z1 -w', "ルⅡ")
=> "繝ォ竇。"
pry(main)> NKF.nkf('-m0Z1 -w', "Ruby Ⅱ")
=> "Ruby 竇。"

なんと、文字の組み合わせ次第では化けてしまいます。

文字化けせずに変換する方法

結論としては、-m0Z1 -W -wとする事で解決しました。
詳しくは次のブログにまとめました。

Rubyで全角英数字を半角英数字にnkfで変換する時の落とし穴 - Y-Ken Studio
http://y-ken.hatenablog.com/entry/ruby-nkf-conversion-problem

あわせて読みたい

半角英数字に変換し、さらに機種依存文字も変換したいケースでは、
NKFではなく次のページで紹介されているunicode gemが万能でお勧めです。

文字列の表記揺れをUnicode正規化で簡単に解決する方法
http://qiita.com/y-ken/items/d08eb7f66c8fb2fa7d21