最終更新 2008-01-14

Unicode正規化とは

# はじめに
# 正規化に関する定義
  正規化形式正規等価性・互換等価性分解マッピング正規結合クラス正規順序正規分解・互換分解正規合成合成除外
# 正規化の安定性
# 安定性に関する方針 [2008-01-14更新]
# 正規化の訂正 [2006-12-27更新]
# 非Unicodeテキストの正規化
# 正規化の結果の例
  平仮名片仮名半角仮名ラテン文字ダイアクリティカルマークギリシア文字キリール文字半角形・全角形正規分解される特殊文字互換分解される特殊文字統合漢字互換漢字ハングルハングル互換字母半角ハングル私用文字
# 参考文献ほか

はじめに

Unicodeでは例えばアクセント付き文字や仮名の濁音・半濁音などを表すのに、合成済み文字 (precomposed character) でも、結合文字列 (combining character sequence) 《基底文字 (base character) の後に1以上の結合文字 (combining character) を続けた列》でもよいことになっています《例えばё = е + ¨、だ = た + ゛、ぷ = ふ + ゜》。また、合成済み文字を結合文字列の基底文字として用いてもよいことになっています。このため、同じ文字が異なる表現で表されることになります。さらに、Unicodeは、従来の文字集合との互換性のため、他の符号化された標準的な文字 (nominal character) と実際的には同等な文字を符号化しています《例えば℃ ≒ °+ C、%≒% 》。このように互いに等価な表現が複数混在したままでは不便であるため、どれかに統一しようというのが、正規化 (Normalization) です。

普通の文字であれば、例えば数字の一 (1) と大文字のアイ (I) と小文字のエル (l)、ラテン文字のエイ (A) とギリシア文字のアルファ (Α) とキリール文字のアー (А)、平仮名の「へ」と片仮名の「ヘ」のように、違うものは違うと理解できます。これらはUnicode正規化においても、当然ながら区別されます。

正規化に関する定義

正規化形式

正規化された結果の形式を、正規化形式 (Normalization Forms) といいます。Unicode Standard Annex 15, 略して UAX #15) は、4種類の正規化形式を規定しています。

覚えかた:D = Decomposition (分解)、C = Composition (合成)、K = Compatibility (互換性;合成の C と区別するため、K になっている)。

このうち、NFDとNFKDは、それぞれUnicode標準で規定された正規分解 (Canonical Decomposition) および互換分解 (Compatibility Decomposition) とまったく同じものです。これに対して、NFCとNFKCは、UAX #15で規定された正規合成 (Canonical Composition) を使用します。すなわち、正規分解のあと正規合成を適用したものをNFC、互換分解のあと正規合成を適用したものをNFKCとします。

UAX #15によれば、NFKDおよびNFKCは、互換分解によって多くの書式上の差異をなくしてしまうため、任意のテキストに対して無闇に用いてはいけない (Normalization forms KC and KD must not be blindly applied to arbitrary text.) が、大文字・小文字を揃える処理のように考えるのが良く、例えば、特定の文脈においてテキストの核心の意味を特定したり、必ずしも適切ではないテキストを修正したりするのに有用とされています。

正規等価性・互換等価性

Unicode標準では、正規分解が互いに等しいことを正規等価性 (Canonical Equivalence)、互換分解が互いに等しいことを互換等価性 (Compatibility Equivalence) といいます。任意の文字列は、そのNFDおよびNFCと正規等価 (canonical equivalent) であり、また、そのNFKDおよびNFKCと互換等価 (compatibility equivalent) です。正規分解・互換分解の定義によれば、互いに正規等価な文字列は、同時に、互換等価の関係にもなります。しかしその逆は必ずしも成り立ちません。

Unicode標準によれば、互いに正規等価な文字列の解釈は当然に違うものになると考えてはなりません。(Unicode標準4.0、第3章、C9; A process shall not assume that the interpretations of two canonical-equivalent character sequences are distinct.)

この要件は2つの意味をもっていて、一つには、互いに正規等価な文字列に対しては必ずしも違う解釈を与える必要がないこと、二つには、いかなるプロセスも、他のプロセスが互いに正規等価な文字列を必ず区別してくれると期待してはならないことです。理念的には、処理系は、互いに正規等価な文字列に対して、いつも同一の解釈を与えてもよいと考えられます。実際的には、処理系が互いに正規等価な文字列を区別するのに合理性がある場合もあるでしょう。いずれにしても、互いに正規等価な文字列は、区別する処理系もあれば、区別しない処理系もあるとして、どちらかに決め付けないことです。

互いに正規等価になるものの典型例としては、合成済み文字と結合文字列(基底文字の後に1以上の結合文字を続けたもの)、互換漢字とそれに対応する統合漢字ハングルの音節文字と字母文字列などがあります。

これに対して、互いに互換等価な文字列は、正規等価でもあるとは限りませんので、適用には一層の注意が必要です。互いに互換等価ではあるが正規等価ではない文字列における解釈の差異は、互いに正規等価な文字列における解釈の差異に比べれば、差異がより大きいと考えられます。

互いに互換等価ではあるが正規等価ではないものの典型例としては、半角形・全角形とその標準的な文字、互換分解される特殊文字に例示したような丸付き文字や括弧付き文字、全角文字などがあります。

分解マッピング

Unicodeの各文字には、分解マッピング(Decomposition Mapping)というものが規定されています。これは、その文字が正規分解・互換分解により分解可能 (decomposable) であれば、どのような文字または文字列に分解されるかを示すものです。正規分解可能な文字の分解マッピングは、正規マッピング(Canonical Mapping) といい《正規分解マッピング (Canonical Decomposition Mapping) ともいう。》、互換分解可能な文字の分解マッピングは、互換マッピング(Compatibility Mapping)といいます《互換分解マッピング(Compatibility Decomposition Mapping)ともいう。》。実際には、分解されない文字(分解マッピングがその文字自身になる。)が圧倒的に多いです。

正規マッピングは、分解後の文字の個数が1か2のいずれかとなります。これは、詳しくは後述しますが、正規合成に正規マッピングを適用するとき、3文字以上を一度に合成するのはアルゴリズムが複雑になるので、一度に2文字ずつ合成し、必要なだけ合成を繰り返すようにしたからです。正規マッピングにより、自身とは異なる1文字に分解する場合 (Singletonといいます。) は、正規合成で元に戻すことはしないので、実質的には置換です。これに対して互換マッピングは、再合成が不要のため、分解後の文字の個数は1文字以上であればよく、制限はありません。

正規結合クラス

正規結合クラス (Canonical Combining Class: 略してCCC)《単に、結合クラス (Combining Class) ともいう。》 とは、基底文字に対して同じように作用する結合文字がグループとなるように分類し、それぞれのグループに数値を割り当てたものです。基底文字と結合文字を判別するため、前者は正規結合クラスを0、後者は正規結合クラスを正の整数 (>0) とします。ただし、基底文字になり得ない制御文字 (control characters) や書式指定文字 (format characters)のほか、結合文字とされる文字の中でも文字を囲んだり前進を伴うものなども、正規結合クラスが0の文字とされます。

正規順序

1つの基底文字に2個以上の結合文字が連結している場合、結合文字の順序を一定に並べなおす必要があります。これに用いる順序を正規順序 (Canonical Ordering) といい、正規順序を得るために用いるアルゴリズムを正規順序アルゴリズム (Canonical Ordering Algorithm) といいます。

正規順序アルゴリズムでは、正規結合クラスが等しい文字の相対的順序を保ちつつ、正規結合クラスが正数の文字同士の順序を相互に並び替えます (reordering)。よって正規順序では、正規結合クラスが0以外の文字は、正規結合クラスが0の文字に対する前後関係を変えることなく、正規結合クラスの数値の小さい順に並ぶという結果が得られます。すなわち、正規結合クラスが0の文字は、正規順序アルゴリズムの適用の前後において文字列における位置が不変なので、並び替えの範囲を制限する役割を果たします。

正規結合クラスが等しい文字の順序が変わらないので、正規順序アルゴリズムの適用の前後で、結合文字が基底文字に作用した結果は不変であることが保証されます。例えば、「a, U+0308 (DIAERESIS), U+0323 (DOT BELOW), , U+3099 (濁点)e, U+0304 (MACRON), U+0301 (ACUTE), U+0323 (DOT BELOW)」からなる文字列を正規順序に並び替えると、次のようになります(文字の下の数値は正規結合クラスを示す)。

並び替え前
a
0
¨
230
220
0
8
e
0
230
´
230
220
正しい並び替え
a
0
220
¨
230
0
8
e
0
220
230
´
230
間違った並び替え
a
0
220
¨
230
0
8
e
0
220
´
230
230

正しい並び替えでは、表示は(A)のままですが、間違った並び替えでは、正規結合クラスが互いに等しいMACRONとACUTEを並び替えたため、表示は(B)のように、eの上のアクセント記号の位置が入れ替わってしまいます。

正規分解・互換分解

ある文字列の正規分解 (Canonical Decomposition) を得るには、まず、それぞれの文字を正規マッピングによって再帰的に、可能な限り、分解します。すなわち、1回分解した後に現れた文字がなおも分解可能であればさらに分解します。分解マッピングがその文字自身である場合は、分解不可能なので、そのままです。

しかし、分解しただけでは必ずしも正しい結果が得られません。つまり、結合文字の順序の一意性を保証するため、分解後の文字列に対して正規順序アルゴリズムを適用しなければなりません。このように、正規マッピングによる再帰的分解と、正規順序アルゴリズムによる並び替えを行った結果が正規分解です。定義により、NFDは正規分解に一致します。

また、互換分解 (Compatibility Decomposition) を得るには、再帰的分解の際に、正規マッピングのみならず、互換マッピングをも使用します。つまり、正規マッピングおよび互換分解による再帰的分解と、正規順序アルゴリズムによる並び替えを行った結果が正規分解です。定義により、NFKDは互換分解に一致します。

正規合成

正規分解や互換分解には合成文字が基底文字と結合文字に分解され、しかも結合文字が一定の順序(上述の正規順序)で配列されるので、処理の簡略化の点では有利と考えられます。しかし、正規分解 (NFD) ・互換分解 (NFKD) のみを正規化形式とすると、正規化形式に合成済み文字を使用できなくなりますから、合成済み文字を多用した従来の文字集合を正規化することが難しくなります。また結合文字を使用しないISO/IEC 10646の実装水準1では正規化形式を利用できません。そこで「合成済み文字を許容する形式」として、NFCおよびNFKCが規定されています。
ただし、必要な合成済み文字が収録されていない場合(例えば「あ」の濁点付き、とか)には結合文字が残ることになり、これもNFCおよびNFKCとして正しい形式ですので、NFCおよびNFKCを「結合文字を排除できる形式」と理解するのは誤りです。

正規合成に必要な概念として「開始文字」(Starter) というものがあります。これは正規結合クラスが0の文字のことです。正規合成による文字の合成は、すべて、開始文字より後の文字を開始文字に合成することによります。また、正規合成の前後で正規等価性を保つ必要があります。

開始文字Sで始まる任意の文字列において、開始文字より後の文字Cは、ある文字BがSとCの間に存在し、かつBの正規結合クラスが0であるか、Cの正規結合クラスと等しい、もしくはより大きい場合(かつその場合のみに)、CがSからブロックされている (blocked) といいます。BがCをブロックしている状況では、Bを飛び越してCをSと合成すると正規等価性が崩れることになります。

正規合成の方法としては、正規分解または互換分解された文字列において、各文字Cを先頭から末尾まで走査するとき、それより前で最後に登場した開始文字Lから文字Cがブロックされているかどうかを調べ、ブロックされていなければ、Cを削除する代わりにLを合成済み文字L-Cで置き換えるというものです。ここで、合成済み文字L-Cとは文字列L + Cに正規等価な合成済み文字とします。ただし、合成済み文字L-Cが合成除外(後述)である場合には、たとえブロックされていなくても合成しません。

正規分解したあとに正規合成した結果がNFCであり、互換分解したあとに正規合成した結果がNFKCです。

なお、従来の正規合成の定義では、ある希なケースでは等価性を維持できない場合があることが発見され、Unicode 4.1.0で訂正がされています。これは、BがLからCをブロックする条件の不備であり、Bの正規結合クラスがCの正規結合クラス「より大きい」場合が欠落したことによります。つまり、以前は、Lの正規結合クラスが0(これはLの定義により自明)、Bの正規結合クラスが正数 (>0)、Cの正規結合クラスが0の場合、L-Cの合成を阻止しませんでした。この結果、正規等価性が破壊されます。ここで、正規結合クラスが0の文字同士を合成する例がなければ問題にならないのですが、それが実在したため、正規合成の定義の訂正が必要になりました。詳しくは[Public Review Issue #29],[Corrigendum #5]参照。

合成除外

合成除外 (Composition Exclusion)とは、正規分解はするけど正規合成はしない合成済み文字のことです。これには四種類あります。

  1. Script-specifics(ある種の用字に特有のもの)
  2. Post Composition Version(Composition Version後に収録されたもの)
  3. Singletons(正規分解マッピングがそれ自身とは異なる一文字からなるもの)。これは、例えば互換漢字やオングストローム(Å)のように、正規化で「より正しい」文字に置換する必要があるとされたものです。
  4. Non-starter decompositions(分解した最初の文字のCanonical Combining Classが0でない場合。これはStarterとして使えない)。二文字の結合文字を合成した合成済み文字に例があります。

このうち、3.と4.は正規合成の仕様から合成できないことは明らかなのですが、1.と2.は特に指定する必要があります。このため、合成除外を具体的に指定した合成除外表 (Composition Exclusion Table)が用意されています。

2.について合成除外とする理由は、以下のとおりです。例えば「今後」、Qにキャロンが付いた合成済み文字Q-caronが追加されたとします(説明の都合上の仮定に過ぎません)。この場合、以前の版では、この文字は、QU+030C (COMBINING CARON) の列で表現されていましたから、新しい版でQ + COMBINING CARONQ-caron に合成することにすると、古いデータが正規化形式でなくなってしまいます。これを防ぐため、正規化によって Q-caronQ + COMBINING CARON に分解しても、逆の合成は行いません。このように、Composition Version後に収録された合成済み文字を合成除外とすることにより、正規化の後方互換性が保証されます《Composition Versionについては次節参照》。

Unicode6.0.0で合成除外の定義が見直され、特に、Non-starter decompositionsの定義が変更されました。それによれば、Canonical Combining Classが0でない(Starterでない)文字について、それがSingletonsに該当する場合は、Non-starter decompositionsに該当しないことが明確にされました。また、分解前にCanonical Combining Classが0でない(Starterでない)文字は、分解した最初の文字のCanonical Combining Classが0であっても、Non-starter decompositionsに該当することが明らかにされました。ただし、この定義の変更によって新たにNon-starter decompositionsに該当することとなった文字や、それに該当しなくなった文字はありません。 [2013-04-13追記]

正規化の安定性

Unicodeには、文字の追補があります。古い版(Version)の文字データに従って正規化した文字列は、新しい版でも正規化形式として通用しなくては、重大な不都合を来たします。そこで、後方互換性を保証するためには、未定義の文字を含まない任意のUnicode文字列は、特定の版で正規化されていれば、将来にわたって正規化形式とならなければなりません。この特定の版をComposition Versionといいます。

現在はComposition VersionはUnicode 3.1.0となっていますが、これは[Corrigendum #2]のため(やむをえず)であり、本来Composition VersionはUnicode 3.0.0です(でした)

とにかく、正規合成が許される合成済み文字は、Unicode 3.0.0までに収録されたものだけです。それより後に収録された合成済み文字は合成除外とされます。
つまり、NFCとNFKCは、最新の文字データに従って正規分解・互換分解を行ったのち、Unicode 3.0.0の文字データに従って正規合成を行うことになります。なお、NFC, NFKCの定義上はComposition Versionの文字データに従って正規合成を行うことになっているのですが、実際にはUnicode 3.1.0で追加された合成済み文字は、すべて合成除外の扱いとなっています。

なお、Unicode 4.1.0の合成除外表を見ると、「(2) Post Composition Version precomposed characters」(Composition Version後の合成済み文字)としては、U+2ADC (FORKING) [Unicode 3.2.0で追加]と、Musical Symbolsブロックに属するU+1D15E―U+1D164およびU+1D1BB―U+1D1C0の13文字 [Unicode 3.1.0で追加] の合計14文字が示されています。つまり、Unicode 3.0.0より後に追加された合成済み文字はこれだけということです。

安定性に関する方針

Unicode標準の安定化に関する方針 (Unicode Character Encoding Stability Policy) によれば、正規化について、以下のように定められています。

正規化の安定性。

一旦文字が符号化されたならば、その正規結合クラスと分解マッピングは、正規化の安定性を解消するような方法で変更することはない。特に、下記の制限はいかなる状況においても維持する。

分解マッピング
分解マッピングは、以下の例外的な状況のすべてに当てはまる場合にのみ、変更することができる。
  • Unicode Character Databaseに明白な誤りがある場合(例えば誤植)、かつ
  • 誤りが文字の同定に関する方針 (#4) に明白に違反している場合、かつ
  • 誤りの訂正が分解マッピングに関する制限 (a)-(d) に反しない場合。
    • (a) 以前に分解マッピングをもっていなかった文字に対して、新たに分解マッピングを与えることはしない。
    • (b) 分解マッピングはどの文字からも削除しない。
    • (c) 分解マッピングのタイプ(正規マッピングから互換マッピングに、あるいはその逆)は変更しない。
    • (d) 分解マッピング中の文字の数は変更しない。
正規結合クラス
  • 正規結合クラスは、文字が収録されたときの値のまま、以後決して変更しない。
  • (注1) 以前のThe Unicode Standard Stability Policyでは、(e), (f)のようになっていました。
    • (e) 正規結合クラスが0の文字は、0以外の正規結合クラスに変更することはない。
    • (f) 二文字のどのような組み合わせにおいても、正規結合クラスの順序関係(大小または同等)は変更しない。
  • (注2) 現在は、値そのものを変更しない方針になりましたから、順序関係も当然保持されます。以前の方針は、正規結合クラスが7ビット値(0..127)で収まるような変更をするかもしれないため制限を緩めていたようですが、現在の方針によれば、そのような変更もできないことになります。

正規化の訂正

残念ながら、互換漢字のなかには、統合漢字との対応表に誤記があったため、後に訂正したものがあります([Corrigendum #3],[Corrigendum #4])。このような場合、古い版のUnicode文字データに基づいて正規化すれば(NFD, NFC, NFKD, NFKCのどれであろうと)、その互換漢字はまったく関係ない統合漢字に変換されてしまいます。とはいえ、それでも変換後の文字列が正規化形式であること自体は間違いではない(Unicode 3.1.0による正規化形式がUnicode 4.0.0でも依然として正規化形式として認められる、という意味。この際、正規化前の文字列が何だったかは無関係。)ので、この訂正はComposition Versionに影響しません。(過ぎたことはしょうがない、ということ?)

どう訂正したのかは、[Normalization Corrections](正規化の訂正)にまとめて記載されます。例えば、Unicode 4.1.0のNormalization Correctionsには次のように書かれています。

F951;96FB;964B;3.2.0 # Corrigendum 3
2F868;2136A;36FC;4.0.0 # Corrigendum 4
2F874;5F33;5F53;4.0.0 # Corrigendum 4
2F91F;43AB;243AB;4.0.0 # Corrigendum 4
2F95F;7AAE;7AEE;4.0.0 # Corrigendum 4
2F9BF;4D57;45D7;4.0.0 # Corrigendum 4

例えば一行目は、U+F951を以前は間違えてU+96FBに対応付けてしまったがU+964Bが正しくて、これをUnicode 3.2.0で訂正しました、という意味です。U+2F868は女偏を土偏と見間違えたようです。他は本当に下らない。まあ互換漢字なんて所詮使わない文字だから、なんて思われていそうです。

なお、Unicode 5.0.0に相当するUAX#15では、これらの漢字(分解マッピングをUnicode Consortium側で勝手に間違えていた文字)については、しょせん極めて稀な漢字に過ぎないのだから、という理屈つきで、Unicode正規化を利用するプロトコルにおいて、正規化の安定性を重視するならば、使用禁止にするという手もある、という方法を提案しています(3.4 Forbidding Charactersを参照)。Unicode正規化を利用するプロトコルの場合、互換漢字の使用が認められたところで結局統合漢字に変換されるのですから、最初から統合漢字を入力した場合と結果が異なるわけではありません。すると、そのプロトコルが特定の互換漢字を何文字か受け付けないものとしたところで、やっぱりどうでもよいのかも知れません。(Unicode正規化は互換漢字の天敵?)

非Unicodeテキストの正規化 [UAX #15, Annex 6]

非Unicode文字集合がUnicodeに対して逆変換可能な変換(invertible transcoding)をもつ場合、Unicode正規化を非Unicode文字集合に拡張することができます。すなわち、非Unicode文字集合 LからUnicodeへの変換を T とおくとき、Lの任意の文字列 S について、T-1(T(S)) = Sが成立することを前提条件とします。

JIS X 0213:2004は、invertible transcodingが規定されていない(例えば<00E6, 0300>や<02E9, 02E5>などに対してT-1を一意に定めることができない。 )ので、Unicode正規化に準じて正規化を定義することができません。

非Unicodeテキストの正規化形式は、Unicodeに変換して、Unicode正規化により正規化して、再び非Unicodeテキストに変換した結果になります。すなわち、Unicode正規化のいずれかの変換を NFX() とおくならば、S の正規化形式は、T-1(NFX(T(S))) により定義されます。

非Unicode文字集合は、Unicode正規化に基づいて3種類に分類できます。

正規化済み (Prenormalized)
当該文字集合のいかなる文字列も、すでに4つの正規化形式の少なくともいずれかである。
正規化可能 (Normalizable)
当該文字集合のいかなる文字列も、正規化済みではないが、正規化できる場合。
正規化不可能 (Unnormalizable)
正規化できない文字列がある場合。

以下、具体例を挙げます。

正規化の結果の例

以下に例として正規化した結果を示します。なお、以下の表中、文字名は必ずしも「日本語通用名称」になっていません。

平仮名

濁音、半濁音は、NFD, NFKD で分解されます。

input NFD NFC NFKD NFKC
U+3042
平仮名あ
U+3042
平仮名あ
U+3042
平仮名あ
U+3042
平仮名あ
U+3042
平仮名あ
U+304C
濁点付き平仮名か
か U+3099
U+304B U+3099
平仮名か+濁点(合成可能)
U+304C
濁点付き平仮名か
か U+3099
U+304B U+3099
平仮名か+濁点(合成可能)
U+304C
濁点付き平仮名か
U+3077
半濁点付き平仮名ふ
ふ U+309A
U+3075 U+309A
平仮名ふ+半濁点(合成可能)
U+3077
半濁点付き平仮名ふ
ふ U+309A
U+3075 U+309A
平仮名ふ+半濁点(合成可能)
U+3077
半濁点付き平仮名ふ
U+3063
小書き平仮名つ
U+3063
小書き平仮名つ
U+3063
小書き平仮名つ
U+3063
小書き平仮名つ
U+3063
小書き平仮名つ

合成済み文字が収録されていない濁音・半濁音は、分解されたままです。《JIS X 0213で「平仮名か+半濁点(合成可能)」は「半濁点付き平仮名か」として符号化されています。》

input NFD,NFC NFKD,NFKC
わ U+3099
U+308F U+3099
平仮名わ+濁点(合成可能)
わ U+3099
U+308F U+3099
平仮名わ+濁点(合成可能)
わ U+3099
U+308F U+3099
平仮名わ+濁点(合成可能)
か U+309A
U+304B U+309A
平仮名か+半濁点(合成可能)
か U+309A
U+304B U+309A
平仮名か+半濁点(合成可能)
か U+309A
U+304B U+309A
平仮名か+半濁点(合成可能)

片仮名

濁音、半濁音は、NFD, NFKD で分解されます。

input NFD NFC NFKD NFKC
U+30A2
片仮名ア
U+30A2
片仮名ア
U+30A2
片仮名ア
U+30A2
片仮名ア
U+30A2
片仮名ア
U+30F4
濁点付き片仮名ウ
ウ U+3099
U+30A6 U+3099
片仮名ウ+濁点(合成可能)
U+30F4
濁点付き片仮名ウ
ウ U+3099
U+30A6 U+3099
片仮名ウ+濁点(合成可能)
U+30F4
濁点付き片仮名ウ
U+30DD
半濁点付き片仮名ホ
ホ U+309A
U+30DB U+309A
片仮名ホ+半濁点(合成可能)
U+30DD
半濁点付き片仮名ホ
ホ U+309A
U+30DB U+309A
片仮名ホ+半濁点(合成可能)
U+30DD
半濁点付き片仮名ホ
U+30F6
小書き片仮名ケ
U+30F6
小書き片仮名ケ
U+30F6
小書き片仮名ケ
U+30F6
小書き片仮名ケ
U+30F6
小書き片仮名ケ

合成済み文字が収録されていない濁音・半濁音は、分解されたままです。《JIS X 0213で「片仮名カ+半濁点(合成可能)」は「半濁点付き片仮名カ」として、「片仮名ト+半濁点(合成可能)」は「半濁点付き片仮名ト」として、符号化されています。》

input NFD,NFC NFKD,NFKC
カ U+309A
U+30AB U+309A
片仮名カ+半濁点(合成可能)
カ U+309A
U+30AB U+309A
片仮名カ+半濁点(合成可能)
カ U+309A
U+30AB U+309A
片仮名カ+半濁点(合成可能)
ト U+309A
U+30C8 U+309A
片仮名ト+半濁点(合成可能)
ト U+309A
U+30C8 U+309A
片仮名ト+半濁点(合成可能)
ト U+309A
U+30C8 U+309A
片仮名ト+半濁点(合成可能)

半角仮名

互換分解で全角化されるので、NFKC, KFKD では全角になります。特筆事項として、半角濁点、半角半濁点は、合成可能な濁点、半濁点になります。これは、特例です(半角濁点は前進を伴う文字なのに、互換的に、前進を伴わない結合文字と等価として扱われること)。このため、濁音、半濁音は、NFKC で合成されます。

input NFD NFC NFKD NFKC
U+FF8A
半角ハ
U+FF8A
半角ハ
U+FF8A
半角ハ
U+30CF
片仮名ハ
U+30CF
片仮名ハ
ヴ
U+FF73 U+FF9E
半角ウ+半角濁点
ヴ
U+FF73 U+FF9E
半角ウ+半角濁点
ヴ
U+FF73 U+FF9E
半角ウ+半角濁点
ウ U+3099
U+30A6 U+3099
片仮名ウ+濁点(合成可能)
U+30F4
濁点付き片仮名ウ
パ
U+FF8A U+FF9F
半角ハ+半角半濁点
パ
U+FF8A U+FF9F
半角ハ+半角半濁点
パ
U+FF8A U+FF9F
半角ハ+半角半濁点
ハ U+309A
U+30CF U+309A
片仮名ハ+半濁点(合成可能)
U+30D1
半濁点付き片仮名ハ

ラテン文字

合成済み文字は、NFD, NFKD で分解されます。

input NFD NFC NFKD NFKC
Á
U+00C1
アキュート付き大文字A
A U+0301
U+0041 U+0301
ラテン大文字A + アキュート(合成可能)
Á
U+00C1
アキュート付き大文字A
A U+0301
U+0041 U+0301
ラテン大文字A + アキュート(合成可能)
Á
U+00C1
アキュート付き大文字A
Å
U+00C5
上リング付き大文字A
A U+030A
U+0041 U+030A
ラテン大文字A+上リング(合成可能)
Å
U+00C5
上リング付き大文字A
A U+030A
U+0041 U+030A
ラテン大文字A+上リング(合成可能)
Å
U+00C5
上リング付き大文字A
Ç
U+00C7
セディラ付き大文字C
C U+0327
U+0043 U+0327
ラテン大文字C + セディラ(合成可能)
Ç
U+00C7
セディラ付き大文字C
C U+0327
U+0043 U+0327
ラテン大文字C + セディラ(合成可能)
Ç
U+00C7
セディラ付き大文字C
È
U+00C8
グレーブ付き大文字E
E U+0300
U+0045 U+0300
ラテン大文字E + グレーブ(合成可能)
È
U+00C8
グレーブ付き大文字E
E U+0300
U+0045 U+0300
ラテン大文字E + グレーブ(合成可能)
È
U+00C8
グレーブ付き大文字E
ñ
U+00F1
チルド付き小文字n
n U+0303
U+006E U+0303
ラテン小文字n + チルド(合成可能)
ñ
U+00F1
チルド付き小文字n
n U+0303
U+006E U+0303
ラテン小文字n + チルド(合成可能)
ñ
U+00F1
チルド付き小文字n
ö
U+00F6
ダイエレシス付き小文字o
o U+0306
U+006F U+0308
ラテン小文字o + ダイエレシス(合成可能)
ö
U+00F6
ダイエレシス付き小文字o
o U+0306
U+006F U+0308
ラテン小文字o + ダイエレシス(合成可能)
ö
U+00F6
ダイエレシス付き小文字o
û
U+00FB
サーカムフレックス付き小文字u
u U+0302
U+0075 U+0302
ラテン小文字u + サーカムフレックス(合成可能)
û
U+00FB
サーカムフレックス付き小文字u
u U+0302
U+0075 U+0302
ラテン小文字u + サーカムフレックス(合成可能)
û
U+00FB
サーカムフレックス付き小文字u

結合文字と対応していない場合、分解されません。

input NFD,NFC NFKD,NFKC
Æ
U+00C6
ラテン大文字AE
Æ
U+00C6
ラテン大文字AE
Æ
U+00C6
ラテン大文字AE
Ð
U+00D0
ラテン大文字ETH
Ð
U+00D0
ラテン大文字ETH
Ð
U+00D0
ラテン大文字ETH
ß
U+00DF
ラテン小文字エスツェット
ß
U+00DF
ラテン小文字エスツェット
ß
U+00DF
ラテン小文字エスツェット
ø
U+00F8
ストローク付き小文字o
ø
U+00F8
ストローク付き小文字o
ø
U+00F8
ストローク付き小文字o
þ
U+00FE
ラテン小文字thorn
þ
U+00FE
ラテン小文字thorn
þ
U+00FE
ラテン小文字thorn

合成済み文字が収録されていない場合、分解されたままです。《JIS X 0213で「ラテン小文字AE+グレーブ(合成可能)」は「グレーブアクセント付きAE小文字」として、符号化されています。》

input NFD,NFC NFKD,NFKC
B U+030A
U+0042 U+030A
ラテン大文字B+上リング(合成可能)
B U+030A
U+0042 U+030A
ラテン大文字B+上リング(合成可能)
B U+030A
U+0042 U+030A
ラテン大文字B+上リング(合成可能)
æ U+0300
U+00E6 U+0300
ラテン小文字AE+グレーブ(合成可能)
æ U+0300
U+00E6 U+0300
ラテン小文字AE+グレーブ(合成可能)
æ U+0300
U+00E6 U+0300
ラテン小文字AE+グレーブ(合成可能)

ダイアクリティカルマーク

通常、前進を伴うダイアクリティカルマークは、NFKD, NFKC で、「スペース+結合文字」に分解されます。したがって、「は゛」のようなものは合成に使われません。

input NFD, NFC NFKD, NFKC
´
U+00B4
アキュート
´
U+00B4
アキュート
SP U+0301
U+0020 U+0301
スペース+アキュート(合成可能)
¨
U+00A8
ダイエレシス
¨
U+00A8
ダイエレシス
SP U+0308
U+0020 U+0308
スペース+ダイエレシス(合成可能)
U+203E
オーバーライン
U+203E
オーバーライン
SP U+0305
U+0020 U+0305
スペース+オーバーライン(合成可能)
¯
U+00AF
マクロン
¯
U+00AF
マクロン
SP U+0304
U+0020 U+0304
スペース+マクロン(合成可能)
U+FFE3
全角マクロン
U+FFE3
全角マクロン
SP U+0304
U+0020 U+0304
スペース+マクロン(合成可能)
¸
U+00B8
セディラ
¸
U+00B8
セディラ
SP U+0327
U+0020 U+0327
スペース+セディラ(合成可能)
U+309B
濁点
U+309B
濁点
SP U+3099
U+0020 U+3099
スペース+濁点(合成可能)
U+309C
半濁点
U+309C
半濁点
SP U+309A
U+0020 U+309A
スペース+半濁点(合成可能)
は゛
U+306F U+309B
平仮名は+濁点
は゛
U+306F U+309B
平仮名は+濁点
は SP U+3099
U+306F U+0020 U+3099
平仮名は+スペース+濁点(合成可能)
ホ゜
U+30DB U+309C
片仮名ホ+半濁点
ホ゜
U+30DB U+309C
片仮名ホ+半濁点
ホ SP U+309A
U+30DB U+0020 U+309A
片仮名ホ+スペース+半濁点(合成可能)

半角の濁点・半濁点は、NFKD, NFKC で、スペースなしで結合文字に分解されます。これは、半角仮名の濁音・半濁音を、NFKC で通常の濁音・半濁音に合成できるようにするための特例です。

input NFD, NFC NFKD NFKC
U+FF9E
半角濁点
U+FF9E
半角濁点
U+3099
U+3099
濁点(合成可能)
U+3099
U+3099
濁点(合成可能)
U+FF9F
半角半濁点
U+FF9F
半角半濁点
U+309A
U+309A
半濁点(合成可能)
U+309A
U+309A
半濁点(合成可能)
ば
U+306F U+FF9E
平仮名は+半角濁点
ば
U+306F U+FF9E
平仮名は+半角濁点
は U+3099
U+306F U+3099
平仮名は+濁点(合成可能)
U+3070
濁点付き平仮名は
ポ
U+30DB U+FF9F
片仮名ホ+半角半濁点
ポ
U+30DB U+FF9F
片仮名ホ+半角半濁点
ホ U+309A
U+30DB U+309A
片仮名ホ+半濁点(合成可能)
U+30DD
半濁点付き片仮名ホ

ASCIIの範囲のダイアクリティカルマークは正規化によって変化しません。その全角形は、NFKD, NFKC では半角になります。

input NFD, NFC NFKD, NFKC
^
U+005E
サーカムフレックス
^
U+005E
サーカムフレックス
^
U+005E
サーカムフレックス
_
U+005F
アンダーライン
_
U+005F
アンダーライン
_
U+005F
アンダーライン
`
U+0060
グレーブ
`
U+0060
グレーブ
`
U+0060
グレーブ
~
U+007E
チルド
~
U+007E
チルド
~
U+007E
チルド
U+FF3E
全角サーカムフレックス
U+FF3E
全角サーカムフレックス
^
U+005E
サーカムフレックス
_
U+FF3F
全角アンダーライン
_
U+FF3F
全角アンダーライン
_
U+005F
アンダーライン
U+FF40
全角グレーブ
U+FF40
全角グレーブ
`
U+0060
グレーブ

ギリシア文字

JIS X 0208に含まれているギリシア文字、例えば、Α(U+0391: 大文字アルファ)、α(U+03B1: 小文字アルファ)などは変化しません。合成済み文字は、NFD, NFKD で分解されます。

input NFD NFC NFKD NFKC
Ά
U+0386
トノス付き大文字アルファ
Α U+0301
U+0391 U+0301
大文字アルファ + アキュート(合成可能)
Ά
U+0386
トノス付き大文字アルファ
Α U+0301
U+0391 U+0301
大文字アルファ + アキュート(合成可能)
Ά
U+0386
トノス付き大文字アルファ
ΐ
U+0390
トノスとダイエレシス付き小文字イオタ
ι U+0308 U+0301
U+03B9 U+0308 U+0301
小文字イオタ + ダイエレシス(合成可能)+ アキュート(合成可能)
ΐ
U+0390
トノスとダイエレシス付き小文字イオタ
ι U+0308 U+0301
U+03B9 U+0308 U+0301
小文字イオタ + ダイエレシス(合成可能)+ アキュート(合成可能)
ΐ
U+0390
トノスとダイエレシス付き小文字イオタ
Ϋ
U+03AB
ダイエレシス付き大文字ユプシロン
Υ U+0308
U+03A5 U+0308
大文字ユプシロン + ダイエレシス(合成可能)
Ϋ
U+03AB
ダイエレシス付き大文字ユプシロン
Υ U+0308
U+03A5 U+0308
大文字ユプシロン + ダイエレシス(合成可能)
Ϋ
U+03AB
ダイエレシス付き大文字ユプシロン
ς
U+03C2
小文字シグマ語尾形
ς
U+03C2
小文字シグマ語尾形
ς
U+03C2
小文字シグマ語尾形
ώ
U+03CE
トノス付き小文字オメガ
ω U+0301
U+03C9 U+0301
小文字オメガ + アキュート(合成可能)
ώ
U+03CE
トノス付き小文字オメガ
ω U+0301
U+03C9 U+0301
小文字オメガ + アキュート(合成可能)
ώ
U+03CE
トノス付き小文字オメガ

ギリシア文字の異体字(記号文字)は、互換分解によりNFKD, NFKCにおいて通常のギリシア文字になります。U+03D3U+03D4は、1文字に対する正規化形式が4種類ともすべて異なる、まれな例です。

input NFD NFC NFKD NFKC
U+03D0
U+03D0
ベータシンボル
U+03D0
U+03D0
ベータシンボル
β
U+03B2
小文字ベータ
U+03D1
U+03D1
シータシンボル
U+03D1
U+03D1
シータシンボル
θ
U+03B8
小文字シータ
U+03D2
U+03D2
フック付きユプシロンシンボル
U+03D2
U+03D2
フック付きユプシロンシンボル
Υ
U+03A5
大文字ユプシロン
U+03D3
U+03D3
アキュートとフック付きユプシロンシンボル
U+03D2 U+0301
U+03D2 U+0301
フック付きユプシロンシンボル + アキュート(合成可能)
U+03D3
U+03D3
アキュートとフック付きユプシロンシンボル
Υ U+0301
U+03A5 U+0301
大文字ユプシロン + アキュート(合成可能)
Ύ
U+038E
トノス付き大文字ユプシロン
U+03D4
U+03D4
ダイエレシスとフック付きユプシロンシンボル
U+03D2 U+0308
U+03D2 U+0308
フック付きユプシロンシンボル + ダイエレシス(合成可能)
U+03D4
U+03D4
ダイエレシスとフック付きユプシロンシンボル
Υ U+0308
U+03A5 U+0308
大文字ユプシロン + ダイエレシス(合成可能)
Ϋ
U+03AB
ダイエレシス付き大文字ユプシロン
U+03D5
U+03D5
ファイシンボル
U+03D5
U+03D5
ファイシンボル
U+03C6
U+03C6
小文字ファイ
U+03D6
U+03D6
パイシンボル
U+03D6
U+03D6
パイシンボル
π
U+03C0
小文字パイ

キリール文字

JIS X 0208に収録されているキリール文字のうち、以下の4字は、NFD, NFKD で分解されます。それ以外のもの、例えば、А(U+0410: キリール大文字アー)、а(U+0430: キリール小文字アー)などは変化しません。

input NFD NFC NFKD NFKC
Ё
U+0401
大文字ヨー
Е U+0308
U+0415 U+0308
大文字イェー+ダイエレシス(合成可能)
Ё
U+0401
大文字ヨー
Е U+0308
U+0415 U+0308
大文字イェー+ダイエレシス(合成可能)
Ё
U+0401
大文字ヨー
Й
U+0419
大文字短いイ
И U+0306
U+0418 U+0306
大文字イー+ブリーブ(合成可能)
Й
U+0419
大文字短いイ
И U+0306
U+0418 U+0306
大文字イー+ブリーブ(合成可能)
Й
U+0419
大文字短いイ
ё
U+0451
小文字ヨー
е U+0308
U+0435 U+0308
小文字イェー+ダイエレシス(合成可能)
ё
U+0451
小文字ヨー
е U+0308
U+0435 U+0308
小文字イェー+ダイエレシス(合成可能)
ё
U+0451
小文字ヨー
й
U+0439
小文字短いイ
и U+0306
U+0438 U+0306
小文字イー+ブリーブ(合成可能)
й
U+0439
小文字短いイ
и U+0306
U+0438 U+0306
小文字イー+ブリーブ(合成可能)
й
U+0439
小文字短いイ

半角形・全角形

半角形・全角形の特殊文字・英数字は、NFKC, KFKD では通常のものになります。半角仮名半角ハングルについては別項目で述べます。

input NFD, NFC NFKD, NFKC
U+FF61
半角句点
U+FF61
半角句点
U+3002
句点
U+FF62
半角始めかぎ括弧
U+FF62
半角始めかぎ括弧
U+300C
始めかぎ括弧
U+FF63
半角終りかぎ括弧
U+FF63
半角終りかぎ括弧
U+300D
終りかぎ括弧
U+FF64
半角読点
U+FF64
半角読点
U+3001
読点
U+FF65
半角中点
U+FF65
半角中点
U+30FB
中点
U+FF22
全角ラテン大文字B
U+FF22
全角ラテン大文字B
B
U+0042
ラテン大文字B
U+FF17
全角数字7
U+FF17
全角数字7
7
U+0037
数字7
U+FF04
全角ドル記号
U+FF04
全角ドル記号
$
U+0024
ドル記号
U+FF07
全角アポストロフィー
U+FF07
全角アポストロフィー
'
U+0027
アポストロフィー
U+FF02
全角引用符
U+FF02
全角引用符
"
U+0022
引用符
U+FFE4
全角破断線
U+FFE4
全角破断線
¦
U+00A6
破断線

もっとも、JISの同じ文字をUnicodeに変換するときにどう変換するかにより、結果が異なる場合もありますが、これはあくまで既存の文字コードからUnicodeへの変換にまつわる問題であって、Unicode正規化の問題ではありません。

input NFD, NFC NFKD, NFKC
U+FF0D
全角ハイフンマイナス
U+FF0D
全角ハイフンマイナス
-
U+002D
ハイフンマイナス
U+2212
負記号
U+2212
負記号
U+2212
負記号
U+FF5E
全角チルド
U+FF5E
全角チルド
~
U+007E
チルド
U+301C
波ダッシュ
U+301C
波ダッシュ
U+301C
波ダッシュ
U+FFE0
全角セント記号
U+FFE0
全角セント記号
¢
U+00A2
セント記号
U+FFE1
全角ポンド記号
U+FFE1
全角ポンド記号
£
U+00A3
ポンド記号
U+FFE2
全角否定
U+FFE2
全角否定
¬
U+00AC
否定
U+FFE5
全角円記号
U+FFE5
全角円記号
¥
U+00A5
円記号

正規分解される特殊文字

濁点付き繰返し記号は濁音仮名に準じます。Unicodeの数学記号で否定の斜線を含むものには、等号否定と同様にU+0338との合成済み文字とされるものが多くあります。オングストロームはSingleton分解により正規化形式中に含まれることはなく、どの正規化形式でも通常のラテン文字になります。

input NFD NFC NFKD NFKC
U+309E
濁点付き平仮名繰返し記号
ゝ U+3099
U+309D U+3099
平仮名繰返し記号+濁点(合成可能)
U+309E
濁点付き平仮名繰返し記号
ゝ U+3099
U+309D U+3099
平仮名繰返し記号+濁点(合成可能)
U+309E
濁点付き平仮名繰返し記号
U+30FE
濁点付き片仮名繰返し記号
ヽ U+3099
U+30FD U+3099
片仮名繰返し記号+濁点(合成可能)
U+30FE
濁点付き片仮名繰返し記号
ヽ U+3099
U+30FD U+3099
片仮名繰返し記号+濁点(合成可能)
U+30FE
濁点付き片仮名繰返し記号
U+2260
等号否定
= U+0338
U+003D U+0338
等号+重なり長斜線(合成可能)
U+2260
等号否定
= U+0338
U+003D U+0338
等号+重なり長斜線(合成可能)
U+2260
等号否定
U+212B
オングストローム
A U+030A
U+0041 U+030A
ラテン大文字A+上リング(合成可能)
Å
U+00C5
上リング付き大文字A
A U+030A
U+0041 U+030A
ラテン大文字A+上リング(合成可能)
Å
U+00C5
上リング付き大文字A

互換分解される特殊文字

JIS X 0208の特殊文字で互換分解をもつもの(ダイアクリティカルマーク半角形・全角形であるものを除く)を以下に示します。これらは、NFD, NFCでは維持されますが、NFKD, NFKCで分解されます。
和字間隔(全角スペース)は、NFKD, NFKCでスペース1個になります(スペース2個にはなりません)。二点リーダや三点リーダは、NFKD, NFKCで複数のピリオドに分解されます(和文なら、複数の中点になって欲しい所ですが、そうはなりません)。

input NFD,NFC NFKD,NFKC
IDSP
U+3000
和字間隔
IDSP
U+3000
和字間隔
SP
U+0020
スペース
U+2025
二点リーダ
U+2025
二点リーダ
..
U+002E U+002E
ピリオド+ピリオド
U+2026
三点リーダ
U+2026
三点リーダ
...
U+002E U+002E U+002E
ピリオド+ピリオド+ピリオド
U+2033
U+2033
′′
U+2032 U+2032
分+分
U+2103
摂氏度記号
U+2103
摂氏度記号
°C
U+00B0 U+0043
度+ラテン大文字C
U+222C
二重積分記号
U+222C
二重積分記号
∫∫
U+222B U+222B
積分記号+積分記号

互換分解をもつ文字のさらなる例として、JIS X 0213とMicrosoft Windows CP932の両方に含まれる非漢字から、いくつか示します。他の類似の文字も、同様な互換分解をもつと考えてよいでしょう。

input NFD, NFC NFKD NFKC
U+2460
丸数字1
U+2460
丸数字1
1
U+0031
数字1
U+2473
丸数字20
U+2473
丸数字20
20
U+0032 U+0030
数字2+数字0
U+2162
ローマ数字3
U+2162
ローマ数字3
III
U+0049 U+0049 U+0049
ラテン大文字I+ラテン大文字I+ラテン大文字I
U+2176
ローマ数字7小文字
U+2176
ローマ数字7小文字
vii
U+0076 U+0069 U+0069
ラテン小文字v+ラテン小文字i+ラテン小文字i
U+3349
全角ミリ
U+3349
全角ミリ
ミリ
U+30DF U+30EA
片仮名ミ+片仮名リ
U+3326
全角ドル
U+3326
全角ドル
ト U+3099 ル
U+30C8 U+3099 U+30EB
片仮名ト+濁点(合成可能)+片仮名ル
ドル
U+30C9 U+30EB
濁点付き片仮名ト+片仮名ル
U+33A1
全角m2
U+33A1
全角m2
m2
U+006D U+0032
ラテン小文字m+数字2
U+337B
全角元号平成
U+337B
全角元号平成
平成
U+5E73 U+6210
統合漢字-平+統合漢字-成
U+2116
全角No
U+2116
全角No
No
U+004E U+006F
ラテン大文字n+ラテン小文字o
U+33CD
全角KK
U+33CD
全角KK
KK
U+004B U+004B
ラテン大文字K+ラテン大文字K
U+2121
全角TEL
U+2121
全角TEL
TEL
U+0054 U+0045 U+004C
ラテン大文字T+ラテン大文字E+ラテン大文字L
U+32A4
丸付き上
U+32A4
丸付き上
U+4E0A
統合漢字-上
U+3231
全角括弧付き株
U+3231
全角括弧付き株
(株)
U+0028 U+682A U+0029
始め丸括弧+統合漢字-株+終り丸括弧

互換分解をもつ文字のさらなる例として、ISO 8859-1 (ラテン1) に含まれる文字から、いくつか示します。なお、逆感嘆符 ¡ (U+00A1)、著作権表示記号 © (U+00A9)、ソフトハイフン SHY (U+00AD)、登録商標記号 ® (U+00AE)、逆疑問符 ¿ (U+00BF) などは変化しません。

input NFD, NFC NFKD, NFKC
NBSP
U+00A0
ノーブレークスペース
NBSP
U+00A0
ノーブレークスペース
SP
U+0020
スペース
ª
U+00AA
女性序数標識
ª
U+00AA
女性序数標識
a
U+0061
ラテン小文字a
º
U+00BA
男性序数標識
º
U+00BA
男性序数標識
o
U+006F
ラテン小文字o
μ
U+00B5
マイクロ記号
μ
U+00B5
マイクロ記号
μ
U+03BC
ギリシア小文字ミュー
¹
U+00B9
上付き1
¹
U+00B9
上付き1
1
U+0031
数字1
²
U+00B2
上付き2
²
U+00B2
上付き2
2
U+0032
数字2
³
U+00B3
上付き3
³
U+00B3
上付き3
3
U+0033
数字3
¼
U+00BC
4分の1
¼
U+00BC
4分の1
1⁄4
U+0031 U+2044 U+0034
数字1 + 分数用斜線 + 数字4
½
U+00BD
2分の1
½
U+00BD
2分の1
1⁄2
U+0031 U+2044 U+0032
数字1 + 分数用斜線 + 数字4
¾
U+00BE
4分の3
¾
U+00BE
4分の3
3⁄4
U+0033 U+2044 U+0034
数字3 + 分数用斜線 + 数字4

統合漢字

すべての統合漢字(拡張A, Bを含む)は、正規化によって変化しません。たとえどんなに字形が似ていても、実質的には異体字に過ぎないとしても、相互の区別が温存されます。

なお、簡体字と繁体字、異体字、原規格分離原則のために包摂分離された漢字などを同一視するための仕組みは、Unicode正規化の範囲外です。この問題についてUnicodeコンソーシアムは、別の仕組みにより解決を試みています。Unicode Technical Report #30 - Character Foldings(まだ原案段階)のHan Character Foldingsを参照のこと。

互換漢字

ほとんどの互換漢字は、非Unicodeの規格との往復の保全性のためにUnicode標準に取り入れられたものです。このような互換漢字としては、韓国のKS C 5601-1987 (後のKS X 1001:1998) において発音の違いだけで別の符号を与えられた漢字 (U+F900―U+FA0B)、台湾のBig 5において誤って二重符号化された漢字 (U+FA0C, U+FA0D)、JIS X 0213互換漢字 (U+FA30―U+FA6A)、北朝鮮(DPRK)の規格の一部の漢字 (U+FA70―U+FAD9)、台湾のCNS 11643-1992の一部の漢字 (U+2F800―U+2FA1D) などがあります。これらの互換漢字は、二重符号化された文字 (duplates) または包摂可能な異体字 (unifiable variants) であるため、いかなる正規化形式においても使用が禁止されており《正規化形式のほか、IDS (Ideographic Description Sequence) にも使用できません》、すべて対応する統合漢字に置換されます。

※以前、Unicode consortiumによるPublic Review の No.7: Tailored normalization formsの中で、正規化形式の変種 (Variant Normalization Forms) が提案されたことがあります。そのうち、互換漢字から統合漢字への変換を行わず、互換漢字が維持されるNFCの変種はVNFC-CI、同じくNFDの変種はVNFD-CIという名称でしたが、結局、種々の問題から正規化形式の変種は採用しないと決定されたようです。

なお、互換漢字には、不幸な例もあります(正規化の訂正を参照。)

input NFD, NFC, NFKD, NFKC
U+F90A
互換漢字-F90A
U+91D1
統合漢字-金
U+F9F4
互換漢字-F9F4
U+6797
統合漢字-林
U+F961 or U+F9DB
互換漢字-F961, F9DB
U+7387
統合漢字-率
U+F95F or U+F9AA
互換漢字-F95F, F9AA
U+5BE7
統合漢字-寧
U+F914, U+F95C, or U+F9BF
互換漢字-F914, F95C, F9BF
U+6A02
統合漢字-樂
U+FA0C
互換漢字-FA0C
U+5140
統合漢字-兀
U+FA10
互換漢字-FA10
U+585A
統合漢字-塚
U+FA19
互換漢字-FA19
U+795E
統合漢字-神
U+FA26
互換漢字-FA26
U+90FD
統合漢字-都

若干の「互換漢字」《IBM互換漢字 (IBM 32 compatibility ideographs) に分類される32文字 (U+FA0E―U+FA2D) 中の12文字 (U+FA0E, U+FA0F, U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29)》は、当初の原規格となった国家規格にはなく、Unicode consortiumによるU source中にのみ存在したもの《すなわちcorporate character》であるために互換漢字ブロックに収録されていますが、統合漢字に包摂できないものですので統合漢字と同列に扱われます。すなわち統合漢字の小さな拡張であり、正規化形式中にそのまま使用することが許されます《IDS (Ideographic Description Sequence) にも使用できます》。実質的な「統合漢字」は、文字の名称《CJK UNIFIED IDEOGRAPH-XXXXであるかCJK COMPATIBILITY IDEOGRAPH-XXXXであるか》ではなく、Unified_Ideograph property(統合漢字属性)により判定します。統合漢字と同列とされる上記12文字は、統合漢字ブロックの漢字と同じく、統合漢字属性をもちます。

input NFD, NFC, NFKD, NFKC
U+FA11
互換漢字-FA11
U+FA11
互換漢字-FA11
U+FA13
互換漢字-FA13
U+FA13
互換漢字-FA13
U+FA14
互換漢字-FA14
U+FA14
互換漢字-FA14
U+FA1F
互換漢字-FA1F
U+FA1F
互換漢字-FA1F
U+FA23
互換漢字-FA23
U+FA23
互換漢字-FA23

ハングル

Unicodeにはハングルを符号化するための文字が数種類ありますが、そのうち標準的に使用されるものは、ハングル字母 (Hangul Jamo; U+1100―U+11FF) とハングル音節文字 (Hangul Syllables; U+AC00―U+D7A3) です。ハングル音節は、音節の頭子音である初声 (leading jamo; CHOSEONG)、母音である中声 (vowel jamo; JUNGSEONG)、末尾子音である終声 (trailing jamo; JONGSEONG) から構成され、初声と中声をもつLV型の音節と、初声と中声と終声をもつLVT型の音節との二種類があります。ハングルには母音字と子音字がありますが、Unicodeでは、母音字は中声字母として、子音字は初声字母および終声字母として収録しています。Unicodeのハングル音節文字は、KS C 5601-1992の組合形 (Johab set) に基づく現代ハングル音節 (modern Hangul syllables) のための合成済み文字11172文字からなります。古ハングル音節 (archaic/ancient Hangul syllables) のための合成済み文字はUnicodeには収録されていませんが、ハングル字母2字以上の組み合わせにより表現することができます。

つまり、古ハングル音節はすでにUnicodeで表現可能であるため、合成済み文字が新たに収録されることはないでしょう。

現代ハングル音節は、NFD, NFKDではハングル字母に分解され、NFC, NFKCではハングル音節文字に合成されます。しかし、字母の合成表示が正しく実装されているのならば、字母に分解されても表示は変化しません。ハングル音節の正規分解は、初声、中声、終声までにとどまり、LV型の音節は2文字に、LVT型の音節は3文字に分解されます。合成字母 (complex jamo) から単純字母列 (sequence of simple jamo) への分解《例えばU+11AA (JONGSEONG KIYEOK-SIOS)からU+11A8 (JONGSEONG KIYEOK) + U+11BA (JONGSEONG SIOS)への分解》、ならびにその逆の合成は行われません。

つまり合成字母は、単純字母列と正規等価にも互換等価にもなりません。Unicode 2.1.8までは合成字母は単純字母列への互換マッピングをもっていました(互換等価でした)が、NFKCですべてのハングル音節が音節文字に合成されることを優先した結果、Unicode 2.1.9において合成字母の互換マッピングは削除されました。

input NFD NFC NFKD NFKC
GA
U+AC00
ハングル音節GA
GA
U+1100 U+1161
ハングル初声KIYEOK + ハングル中声A
GA
U+AC00
ハングル音節GA
GA
U+1100 U+1161
ハングル初声KIYEOK + ハングル中声A
GA
U+AC00
ハングル音節GA
GAG
U+AC01
ハングル音節GAG
GAG
U+1100 U+1161 U+11A8
ハングル初声KIYEOK + ハングル中声A + ハングル終声KIYEOK
GAG
U+AC01
ハングル音節GAG
GAG
U+1100 U+1161 U+11A8
ハングル初声KIYEOK + ハングル中声A + ハングル終声KIYEOK
GAG
U+AC01
ハングル音節GAG
GAGS
U+AC03
ハングル音節GAGS
GAGS
U+1100 U+1161 U+11AA
ハングル初声KIYEOK + ハングル中声A + ハングル終声KIYEOK-SIOS
GAGS
U+AC03
ハングル音節GAGS
GAGS
U+1100 U+1161 U+11AA
ハングル初声KIYEOK + ハングル中声A + ハングル終声KIYEOK-SIOS
GAGS
U+AC03
ハングル音節GAGS

古ハングル音節(中世語 (あるいは中期朝鮮語) に特有の字母を含む音節)の正規化では、正規化してもハングル字母のままである場合もあり、あるいは、音節の一部がハングル音節文字に合成されて他の字母が音節文字の前後に残る場合もあります。いずれにしても、古ハングル音節の正規化は、合成母音または合成子音が、必ずしも1文字の合成字母として収録されていない(例えば下記の CHOSEONG NIEUN-SIOS)ので、複数の字母を用いて表現せざるを得ない場合があるにもかかわらず、合成字母は単純字母列と等価ではないため、Unicode正規化が音節の等価性を判定するためには役に立たないという問題があります。

なお、古ハングル音節に必要な字母としては、Microsoft社のCreating and supporting OpenType fonts for the Korean Hangul scriptの中の、Appendix B: Standard composition for Old Hangul Jamosに詳しくまとめられています。また、現代ハングルと古ハングルを矛盾なく扱うための分解形および合成形として、Kyongsok KIM氏の提案 New canonical decomposition and composition processes for Hangeul (ISO/IEC JTC1/SC22/WG20 N954) があります(この提案による分解形とは、つまり合成字母をすべて単純字母に分解するということです)。

input NFD NFC NFKD NFKC
N@N
U+1102 U+119E U+11AB
ハングル初声NIEUN + ハングル中声ARAEA + ハングル終声NIEUN
N@N
U+1102 U+119E U+11AB
ハングル初声NIEUN + ハングル中声ARAEA + ハングル終声NIEUN
N@N
U+1102 U+119E U+11AB
ハングル初声NIEUN + ハングル中声ARAEA + ハングル終声NIEUN
N@N
U+1102 U+119E U+11AB
ハングル初声NIEUN + ハングル中声ARAEA + ハングル終声NIEUN
N@N
U+1102 U+119E U+11AB
ハングル初声NIEUN + ハングル中声ARAEA + ハングル終声NIEUN
NA-NG
U+1102 U+1161 U+11F0
ハングル初声NIEUN + ハングル中声A + ハングル終声YESIEUNG
NA-NG
U+1102 U+1161 U+11F0
ハングル初声NIEUN + ハングル中声A + ハングル終声YESIEUNG
NA-NG
U+B098 U+11F0
ハングル音節NA + ハングル終声YESIEUNG
NA-NG
U+1102 U+1161 U+11F0
ハングル初声NIEUN + ハングル中声A + ハングル終声YESIEUNG
NA-NG
U+B098 U+11F0
ハングル音節NA + ハングル終声YESIEUNG
NSI
U+1102 U+1109 U+1175
ハングル初声NIEUN + ハングル初声SIOS + ハングル中声I
NSI
U+1102 U+1109 U+1175
ハングル初声NIEUN + ハングル初声SIOS + ハングル中声I
NSI
U+1102 U+C2DC
ハングル初声NIEUN + ハングル音節SI
NSI
U+1102 U+1109 U+1175
ハングル初声NIEUN + ハングル初声SIOS + ハングル中声I
NSI
U+1102 U+C2DC
ハングル初声NIEUN + ハングル音節SI

ハングル互換字母

ハングル互換字母 (Hangul Compatibility Jamo; U+3131―U+318Eの94字) は、互換分解でハングル字母に変換されます。互換字母には初声と終声の区別がありませんが、互換分解で初声になるか終声になるかは文脈に左右されることなく字母ごとに決まっていますので、NFKCでLVT型のハングル音節(初声L + 中声V + 終声T)に合成されるとは限りません。また、初声フィラー (U+115F) や中声フィラー (U+1160) の挿入は行われませんので、標準の音節ブロックが形成されないことがあります。

input NFD,NFC NFKD NFKC
KIYEOK A
U+3131 U+314F
ハングル文字KIYEOK + ハングル文字A
KIYEOK A
U+3131 U+314F
ハングル文字KIYEOK + ハングル文字A
GA
U+1100 U+1161
ハングル初声KIYEOK + ハングル中声A
GA
U+AC00
ハングル音節GA
KIYEOK A KIYEOK
U+3131 U+314F U+3131
ハングル文字KIYEOK + ハングル文字A + ハングル文字KIYEOK
KIYEOK A KIYEOK
U+3131 U+314F U+3131
ハングル文字KIYEOK + ハングル文字A + ハングル文字KIYEOK
GA KIYEOK
U+1100 U+1161 U+1100
ハングル初声KIYEOK + ハングル中声A + ハングル初声KIYEOK
GA KIYEOK
U+AC00 U+1100
ハングル音節GA + ハングル初声KIYEOK
KIYEOK A KIYEOK-SIOS
U+3131 U+314F U+3133
ハングル文字KIYEOK + ハングル文字A + ハングル文字KIYEOK-SIOS
KIYEOK A KIYEOK-SIOS
U+3131 U+314F U+3133
ハングル文字KIYEOK + ハングル文字A + ハングル文字KIYEOK-SIOS
GAGS
U+1100 U+1161 U+11AA
ハングル初声KIYEOK + ハングル中声A + ハングル終声KIYEOK-SIOS
GAGS
U+AC03
ハングル音節GAGS

半角ハングル

半角ハングル (Halfwidth Hangul Variants; U+FFA0―U+FFDC) は、ハングル互換字母と同様に、互換分解でハングル字母に変換されます。

input NFD,NFC NFKD NFKC
KIYEOK A
U+FFA1 U+FFC2
半角ハングル文字KIYEOK + 半角ハングル文字A
KIYEOK A
U+FFA1 U+FFC2
半角ハングル文字KIYEOK + 半角ハングル文字A
GA
U+1100 U+1161
ハングル初声KIYEOK + ハングル中声A
GA
U+AC00
ハングル音節GA
KIYEOK A KIYEOK
U+FFA1 U+FFC2 U+FFA1
半角ハングル文字KIYEOK + 半角ハングル文字A + 半角ハングル文字KIYEOK
KIYEOK A KIYEOK
U+FFA1 U+FFC2 U+FFA1
半角ハングル文字KIYEOK + 半角ハングル文字A + 半角ハングル文字KIYEOK
GA KIYEOK
U+1100 U+1161 U+1100
ハングル初声KIYEOK + ハングル中声A + ハングル初声KIYEOK
GA KIYEOK
U+AC00 U+1100
ハングル音節GA + ハングル初声KIYEOK
KIYEOK A KIYEOK-SIOS
U+FFA1 U+FFC2 U+FFA3
半角ハングル文字KIYEOK + 半角ハングル文字A + 半角ハングル文字KIYEOK-SIOS
KIYEOK A KIYEOK-SIOS
U+FFA1 U+FFC2 U+FFA3
半角ハングル文字KIYEOK + 半角ハングル文字A + 半角ハングル文字KIYEOK-SIOS
GAGS
U+1100 U+1161 U+11AA
ハングル初声KIYEOK + ハングル中声A + ハングル終声KIYEOK-SIOS
GAGS
U+AC03
ハングル音節GAGS

私用文字

私用文字 (private-use characters)、すなわち私用領域 (private use area; U+E000―U+F8FF)、補助私用領域A (supplementary private use area A; U+F0000―U+FFFFD) 、および補助私用領域B (supplementary private use area B; U+100000―U+10FFFD) の文字は、分解マッピングがその文字自身であり、正規結合クラスも0とされているので、正規化によって何ら変化しません。すなわち、私用領域に定義された私用文字の性質は、Unicode正規化に対して何の影響を与えることもありません。しかし、Unicode正規化にならって、私用文字の性質に適した分解および合成のための変換 (transformation) を独自に定義することは禁止されていません。例えば、U+E000にaと同等な文字を私的に割り当てた場合に、"MyCompanyComposition"と称して、U+E000をaにマッピングする以外はNFCとまったく同じという変換を定義することは差し支えありませんが、この"MyCompanyComposition"をNFCと称することは許されません。


参考文献ほか

  1. http://www.unicode.org/standard/standard.html
    About the Unicode Standard
  2. http://www.unicode.org/reports/tr15/
    Unicode Normalization Forms
  3. http://www.unicode.org/faq/normalization.html
    Unicode Frequently Asked Questions - Normalization
  4. http://www.unicode.org/versions/corrigendum2.html
    Corrigendum #2: Yod with Hiriq Normalization
  5. http://www.unicode.org/versions/corrigendum3.html
    Corrigendum #3: U+F951 Normalization
  6. http://www.unicode.org/versions/corrigendum4.html
    Corrigendum #4: Five CJK Canonical Mapping Errors
  7. http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt
    Normalization Corrections
  8. http://www.unicode.org/review/pr-29.html
    Public Review Issue #29: Normalization Issue
  9. http://www.unicode.org/versions/corrigendum5.html
    Corrigendum #5: Normalization Idempotency
  10. http://www.unicode.org/policies/stability_policy.html
    Unicode Character Encoding Stability Policy

戻る