解決

def find_dakuon_and_handakuon(kana)
  codepoints = kana.codepoints[0]
  moji = codepoints.chr(Encoding::UTF_8)
  dakuon = moji + "\u3099" # 濁点
  handakuon = moji + "\u309a" # 半濁点

  [
    ActiveSupport::Multibyte::Unicode.normalize(dakuon, :c),
    ActiveSupport::Multibyte::Unicode.normalize(handakuon, :c)
  ]
end

実行結果

find_dakuon_and_handakuon('ハ')
# => ["バ", "パ"]

find_dakuon_and_handakuon('セ')
# => ["ゼ", "セ゚"]

経緯

先頭のカタカナ一文字から銀行の支店名の検索するシステムで、濁点(バ)、半濁点(パ)の考慮されていなかった。 「ハ」で検索した際に、「バ」、「パ」で始まる支店名も検索したい。

調査

カタカナに濁点と半濁点をつける

Rubyで平仮名(ひらがな)と片仮名(カタカナ)に濁点と半濁点を付ける - Qiita

これで作成されるのは2文字である。 下記の問題が発生してしまう。

濁点の合成文字がソースコードに入っちまった💢 -> gitのpre-commit hookで打ち勝った · hoshinotsuyoshi.com - 自由なブログだよ

濁点アリの1文字「バ」、2文字「ハ」+「゛」、2文字「ハ」+「゙」

分離した2文字を一文字にする

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

より、下記メソッドを使用

ActiveSupport::Multibyte::Unicode.normalize