方法
コード
'タピオカ'.gsub(/[\uFF61-\uFF9F]+/) { |str| str.unicode_normalize(:nfkc) }
#=> "タピオカ"
説明
-
'タピオカ'.unicode_normalize
と書かずに gsub を介しているのは、Unicode 正規化を適用する文字列を限定し、想定外の置換が起きないようにするため。 - 半角カタカナの Unicode コードポイントについては、@scivola さんのコメント、および Wikipedia の 半角カナ ≫ Unicode (UTF-8, UTF-16 など) を参考にした。
旧方法
@scivola さんにコメントをいただく前に紹介したいた方法。半角カタカナ以外も Unicode 正規化してしまうため改善が必要だった。
コード
'カンダタ'.gsub(/\p{In_Halfwidth_and_Fullwidth_Forms}+/) { |str| str.unicode_normalize(:nfkd) }
#=> "カンダタ"
説明
- Ruby の正規表現では
\p{}
で Unicode プロパティを指定できる。- 指定可能な Unicode プロパティの一覧は Onigmo/doc/UnicodeProps.txt1 を参照すること
- 半角カタカナや半角濁点・半濁点は Halfwidth and Fullwidth Forms に属している。
関連
参考
Unicode 正規化について復習するのに以下のページが役立った。