13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

13
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?