4

Rubyでひらがなから濁点を分離したいと考えていますがどのような実装が考えられるか教えていただけませんでしょうか?

a = remove_dakuten('だ')
puts a
\# た゛
ksh
  • 185
  • 6

2 Answers2

10

Unicodeっぽく処理をするのであれば、NFD正規化で濁点を分離できます。

"だ".unicode_normalize(:nfd) #=> 「た」+U+3099

ただし、この分離された濁点文字(U+3099)は前の文字と結合するための特殊な文字なので、通常の濁点文字(U+309B)にしたい場合は次のように変換すればいいと思います。

"だ".unicode_normalize(:nfd).tr("\u3099", "\u309b") #=> 「た」+「゛」

半濁点も同様にするにはこんな感じで。

"ぱ".unicode_normalize(:nfd).tr("\u3099\u309a", "\u309b\u309c") #=> 「は」+「゜」
tmtms
  • 3,537
  • 1
  • 12
  • 12
2

文字コードの表で一つ前の文字を参照するというのはどうでしょうか。

def remove_dakuten(char)
    (char.ord - 1).chr('UTF-8')
end

puts remove_dakuten('だ')

参考

ciffelia
  • 21
  • 4
  • 1
    リンク先がきれてしまった際に回答を損うことが無いようにサンプルコード自体も質問文に含めてください。 https://ja.stackoverflow.com/help/how-to-answer –  Aug 21 '18 at 02:37
  • @Myaku ご指摘有難うございます。修正いたしました。 – ciffelia Aug 21 '18 at 02:49
  • なるほどこの発想はありませんでした!ありがとうございます! – ksh Aug 23 '18 at 01:02