PIYO - Tech & Life -

Rubyで濁点/半濁点が分離した文字を1文字に統一するには

unicode Ruby

Macのファイル名周りで発生するのでハマったことがある人もいると思うんだけど、ひらがなやカタカナの濁音や半濁音の文字を表現するのに2文字分使われていることがあったりする。

例えばFinderでぱぴぷぺぽ.txtというファイルを作ってEmacsで開いてみるとこんなふうになる。

Rubyでもこの手のファイル名から文字列を作ったりすると同じようなことが起こる。例えばこんな感じで。

同じ文字列に見えて全く違うってことが起こる。こういう文字列がデータベースに入っていると検索にかからないことがあるし他にも色々困ったことになりそうな感じがする。

なお、この手の話を真面目に語るには僕の知識は足りないので今回はどうやって回避するかを書くだけに留めるけど、軽く触れておくとUnicodeの正規化に関係する現象らしいということがわかった。

Unicode正規化 - Wikipedia

対策

このタイプの文字列が入力として入ってきそうな箇所で正規化の形式を変換しておくことで対処できた。変換にはActiveSupportのメソッドを使用した。

normalize (ActiveSupport::Multibyte::Unicode) - APIdock

# 例えばファイル名から文字列をとってくる
name = File.basename(textfile, '.txt') # "は゜ひ゜ふ゜へ゜ほ゜"
name = ActiveSupport::Multibyte::Unicode.normalize(filename, :c) # "ぱぴぷぺぽ"