LoginSignup
0
0

個人的「質はともかく継続する」9日目です

前回の続きで、Unicode正規化の4種類について調べてみた記録です。
前回はこちら

Unicode正規化について調べてみた

NFC (Normalization Form Canonical Composition)

NFCは、文字を正準等価性によって分解した後、再度合成する正規化形式。

結合文字列を合成済み文字に変換する。
文字数のバイト数を減らせる可能性がある。
Windowsのキーボード入力や、Windows、Microsoft アプリケーション、および .NET Frameworkは
NFCなんだそう。

例えば、
"が" という文字は、NFCでは合成済み文字
「が」 (\xe3\x81\x8c) となる。

NFD (Normalization Form Canonical Decomposition)

NFDは、文字を正準等価性によって分解する正規化形式。

合成済み文字を結合文字列に変換する。
文字列の比較や検索が容易になる。
macOSのファイルシステムHFS+では、NFDの変種が用いられいるそう。
文字列の比較や検索を行う場合に適している。

例えば、
"が" という文字は、NFDでは結合文字列
「か」 (\xe3\x81\x8b) +「 ゙」 (\xe3\x82\x99)」となる。

NFKD (Normalization Form Compatibility Decomposition)

NFKDは、文字を互換等価性によって分解する正規化形式。

視覚的に異なる文字であっても、同じ意味を持つと判断される場合は、同一の文字に変換される。
互換等価性による分解は、正準等価性に比べて文字の同一視条件が緩いため、
より多くの文字が同一視される可能性がある。
文字列の比較処理を簡略化したい場合に適している。

例えば、
全角の "ガ" は、NFKDでは
「カ」 (\xe3\x82\xab) +「 ゙」 (\xe3\x82\x99)" となる。
"①"、"1"、"1"は、NFKDではすべて "1" となる。

NFKC (Normalization Form Compatibility Composition)

NFKCは、文字を互換等価性によって分解した後、正準等価性によって再度合成する正規化形式。

NFKDと同様に、視覚的に異なる文字を同一視するため、文字列の比較処理を簡略化できる。
NFCと同様に、結合文字列を合成済み文字に変換するため、文字列のバイト数を減らせる可能性がある。
文字列の比較を簡単にしつつ、ファイルサイズも小さくする場合に使われる。
また、自然言語処理の分野で、文字列の正規化処理としてよく利用される。

例えば、
"①"、"1"、"1"は、NFKCではすべて "1" に変換される。

Unicode正規化の注意点

正規化を行うと、元の文字列の表現に戻せない場合がある。
NFKCとNFKDは、互換性のために情報を損失する可能性がある。

まとめ

普段の開発ではあまり意識する場面がなかったのですが、
改めて勉強してみると意識しておいたほうがいいことばかりでした。
文字コード、また改めて勉強しなおしたいな。

参考:

Unicode 正規化を使用して文字列を表す

Unicode正規化

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