14
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

Organization

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
14
Help us understand the problem. What are the problem?