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