1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaScriptでUnicodeの濁点・半濁点を分離する

Last updated at Posted at 2022-05-18

濁点・半濁点を分離する関数の作成中、Unicode上での濁点・半濁点の扱いに戸惑ったのでメモ書き。

NFDとNFC

Unicodeの中にも、
NFC:Normalization Form Canonical Composition (合成済みの文字)
NFD:Normalization Form Canonical Decomposition (複数文字を結合した文字列)
と種類があるらしい。

JavaScriptの文字列はデフォルトではNFCとして扱われるが、
'文字列'.normalize('NFD')
でNFDに変換できる。

表記の違い

それぞれencodeURIでエンコードすると分かりやすい。

nfc.js
console.log( encodeURI(''.normalize('NFC')) );
//%E3%81%8B

console.log( encodeURI(''.normalize('NFC')) );
//%E3%81%8C
nfd.js
console.log( encodeURI(''.normalize('NFD')) );
//%E3%81%8B

console.log( encodeURI(''.normalize('NFD')) );
//%E3%81%8B%E3%82%99

NFCでは「か」と「が」は別の文字と区別されているのに対して、NFDでは「か + ゛」といったように濁点用の文字(%E3%82%99)が用意されていることが分かる。
ちなみに半濁点「゜」(%E3%82%9A)もあった。

一応結果

最初は10行くらいあったdakuten関数が1行にまとまってかなりのダイエット成功。
NFD/NFCとか聞いたこともなかったので他の人がハマらないようお役に立てると幸いです。

引用

参考にさせて頂きました。より詳しい部分が解説されています。

1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?