LoginSignup
7
6

「が」を「か゛」のように、ひらがなの濁点・半濁点を分離したい

Last updated at Posted at 2023-09-09

概要

「が」を「か゛」のように、ひらがなの濁点・半濁点を分離する処理が必要になったことは、ありますか?(私はありました:thumbsup:

今回は、作成したJavaScriptの関数を紹介します。

作成した関数

まずは、結果から説明します。

下記が完成したJavaScriptの関数です。
ひらがなの対応表を作成するのもよかったのですが、コードが肥大化してしまうため、normalize()encodeURI()を用いて処理を組みました。

内容としては、ひらがな1文字を引数を渡して、濁点・半濁点の文字だったら分離し文字列を返す処理になっています。

関数

let dakutenSeparation = (kana) => {
  const normalizeKana = kana.normalize('NFD');
  const encodeStr = encodeURI(normalizeKana);

  if (encodeStr.match(/%E3%82%99$/g)) {
    return normalizeKana[0] + ""; 
  } else if (encodeStr.match(/%E3%82%9A$/g)) {
    return normalizeKana[0] + ""; 
  } else {
    return kana;
  }
}

実際の動作

Animation.gif

コード解説

ひらがなの正規化

const normalizeKana = kana.normalize('NFD');

normalize()を使用し、ひらがなのUnicode正規化形式を取得しています。
この後の処理へ渡すための準備となります。

エンコード

const encodeStr = encodeURI(normalizeKana);

encodeURI()を使用しひらがなをエンコードしています。
実際にエンコードすると以下のような文字列に代わります。

エンコード結果
'が' → '%E3%81%8B%E3%82%99'

エンコードされた末尾の文字列の判定

encodeStr.match(/%E3%82%99$/g);
encodeStr.match(/%E3%82%9A$/g);

IF文の判定処理で、謎の文字列で判定しています。
この文字列は、エンコード結果を確認すると濁点と半濁点なことが分かるので、末尾の文字列で判定を行っています。

エンコード結果
'か' → '%E3%81%8B'
'が' → '%E3%81%8B%E3%82%99'

'く' → '%E3%81%8F'
'ぐ' → '%E3%81%8F%E3%82%99'

'は' → '%E3%81%AF'
'ぱ' → '%E3%81%AF%E3%82%9A'

'ひ' → '%E3%81%B2'
'ぴ' → '%E3%81%B2%E3%82%9A'

結果を返す

return normalizeKana[0] + ""; 

normalizeKana[0]を取得すると、濁点が取れたひらがなが取得できます。
normalizeKana[1]を取得しても、想定した形の濁点・半濁点が入っていないため、判定した内容で直接濁点半濁点の文字を指定して、結合しています。

まとめ

分離した濁点・半濁点を結合する処理は、PDFの解析などするときはよくありますが、分離したいことは多くはないと思われます。
そのため、少しでも困った人の参考になればと思い紹介しました。

ここまで読んでいただきありがとうございました。

おまけ

ひらがなだけではなくカタカナも対応してます!
Animation.gif

7
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6