47685


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

### 例

[code]

    a = remove_dakuten('だ')
    puts a
    \# た゛
    
[/code]


CC BY-SA 4.0
2018-08-21T01:38:34.427
47682
2018-08-21T03:12:01.600
9178
question
ruby
Rubyで濁点を分離したい


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

[code]

    def remove_dakuten(char)
        (char.ord - 1).chr('UTF-8')
    end
    
    puts remove_dakuten('だ')
    
[/code]

### 参考

  * ord, chrメソッドについて: <http://chuckwebtips.hatenablog.com/entry/2016/05/03/000000>
  * UTF-8ひらがなカタカナ表: <http://aspiration.sakura.ne.jp/wiki/index.php?develop%2FUTF-8%E3%81%B2%E3%82%89%E3%81%8C%E3%81%AA%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A%E8%A1%A8>


CC BY-SA 4.0
2018-08-21T01:55:22.197
47683
2018-08-21T02:47:31.397
2018-08-21T02:47:31.397
20007
20007
47682
answer


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

[code]

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

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

[code]

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

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

[code]

    "ぱ".unicode_normalize(:nfd).tr("\u3099\u309a", "\u309b\u309c") #=> 「は」+「゜」
    
[/code]


CC BY-SA 4.0
2018-08-21T03:12:01.600
47685
2018-08-21T03:12:01.600
3249
47682
answer