[46] [DFN[[RUBYB[[[完全正規化済み]]]@en[fully-normalized]]]]とは、[[XML文書]]が [[NFC]]
で、[[名前]]や[[文字データ]]などの先頭が[[合成文字]]や[[合成文字]]の[[文字参照]]でないことをいいます。

* 仕様書

[REFS[
- [3] '''[CITE@en[Character Model for the World Wide Web 1.0: Normalization]] ([TIME[2012-04-27 11:15:23 +09:00]] 版) <http://www.w3.org/TR/charmod-norm/#sec-FullyNormalized>'''
- [8] [CITE@en[Character Model for the World Wide Web 1.0: Normalization]] ([TIME[2012-04-27 11:15:23 +09:00]] 版) <http://www.w3.org/TR/charmod-norm/#sec-NormalizationApplication>
- [22] [CITE@en[Extensible Markup Language (XML) 1.1 (Second Edition)]] ([TIME[2006-09-29 19:02:09 +09:00]] 版) <http://www.w3.org/TR/2006/REC-xml11-20060816/#sec-CharNorm>
- [24] [CITE@en[Extensible Markup Language (XML) 1.1 (Second Edition)]] ([TIME[2006-09-29 19:02:09 +09:00]] 版) <http://www.w3.org/TR/2006/REC-xml11-20060816/#dt-relconst>
- [38] [CITE@en[Errata in REC-xml-20081126]] ([TIME[2013-02-13 15:08:50 +09:00]] 版) <http://www.w3.org/XML/xml-V10-5e-errata#E20090916>
]REFS]

* 定義

[4] [[テキスト]]が[DFN[[RUBYB[[[完全正規化済み]]]@en[fully-normalized]]]]であるとは、次のいずれか指します [SRC[>>3]]。
- [5] [[テキスト]]が[[Unicode符号化形]]であり、[[取り込み正規化済み]]であり、
[[合成文字]]や[[合成文字]]を表す[[文字エスケープ]]で始まる[[テキスト]]から成る[[構造]]を含まない
- [6] [[テキスト]]が[[レガシー符号化]]されており、[[正規化転符号化器]]で[[Unicode符号化形]]に[[転符号化]]したら
>>5 を満たす

[7] ある[[言語]]における >>5 の「[[構造]]」とされる単位のことを[[関係する構造]]と呼んでいます。

* Charmod における完全正規化済みテキスト

[9] [[Charmod]] に適合する仕様書やそのデータや実装は次のことを要求されています [SRC[>>8]]。
[FIG[
- [10] [[テキスト]]は[[完全正規化済み]]である[['''べきです''']]。そうでなくても[[取り込み正規化済み]]である[['''べきです''']]。
- [11] 構文定義は[[完全正規化済み]]または[[取り込み正規化済み]]を要求する[['''べきです''']]。
>>5 の[[構造]]の境界を正確に定義する[['''べきです''']]。
- [12] [[suspect text]] は[[完全正規化済み]]または[[取り込み正規化済み]]にしてからでないと [[normalization-sensitive]]
な操作を適用しては[['''なりません''']]し、 [[normalization-sensitive]] な操作の直後にも同じく[[正規化]]しなければ[['''なりません''']]。
- [13] [[完全正規化済み]]が要求されなくても、[[著者]]は[[構造]]の先頭に[[合成文字]]を使う[['''べきではありません''']]。
- [14] [[正規化転符号化器]]を使う[['''べきです''']]。
- [15] [[API]] は[[完全正規化済み]]または[[取り込み正規化済み]]にする責任をもつのが呼び出し元か呼ばれた先のどちらか定義しなければ[['''なりません''']]し、
任意選択とするなら行う方を既定値とする[['''べきです''']]。
- [16] 最終的な出力が[[完全正規化済み]]または[[取り込み正規化済み]]であることを要求する[['''べきです''']]。
- [17] 仕様書や実装が以上の条件に違反する時は、明記しなければ[['''なりません''']]。
- [18] 仕様書は[[完全正規化済み]]や[[取り込み正規化済み]]に関わる[[セキュリティー]]上の既知の問題を記載しなければ[['''なりません''']]。
]FIG]

[19] [[Charmod]] は [[string identity matching]] においても[[完全正規化済み]]形を求めています。

;; [20] この要件に素直に従うとほとんどすべての文字列操作の直後に[[正規化]]しなければならず、
流石にそんな要求に従っている仕様書も実装もありません。[[完全正規化済み]]なる概念自体が [[W3C]]
のごく一部の仕様書以外ではほとんど無視されています。

* XML 1.1 における完全正規化済み形

[23] [[XML 1.1]] は [[Charmod]] の[[コピペ][新規格の先行コピペ]]により同等の「[[完全正規化済み]]」を独自に定義しています [SRC[>>22]]。

[25] [[XML 1.1]] [[構文解析対象実体]]は[[完全正規化済み]]である[['''べきです''']] [SRC[>>24]]。
ここで[[関連する構造]]は次のものです [SRC[>>24]]。
[FIG[
- [26] [[構文解析対象実体]]の[[置換文]]
- [27] [CODE(ABNF)@en[[[CData]]]] ([[CDATA区間]]の[[テキスト]])
- [28] [CODE(ABNF)@en[[[CharData]]]] ([[要素]]の中の[[テキスト]])
- [29] [CODE(ABNF)@en[[[content]]]] ([[要素]]の[[内容]])
- [30] [CODE(ABNF)@en[[[Name]]]]
- [31] [CODE(ABNF)@en[[[Nmtoken]]]]
]FIG]

[32] [[XML 1.1]] の [[XML処理器]]は[[利用者]]に[[完全正規化済み]]形かどうか検査する選択肢を提供する[['''べきです''']]
[SRC[>>24]]。検査しない選択肢は、入力が [[certified text]] の時だけ選ぶ[['''べきです''']] [SRC[>>24]]。

;; [33] >>32 後半は[[利用者]]に対する適合性???

[34] [[妥当性を検証しない]] [[XML処理器]]は、[[読んでいない]][[外部実体]]の[[取り込み]]によって起こり得る[[正規化]]の崩れは無視しなければ[['''なりません''']]
[SRC[>>24]]。

[35] 新しい[[Unicodeの版]]の[[文字]]など[[正規化]]の特性を決定できない[[文字]]がある時は、
[[利用者の任意選択]]により、それによる[[正規化]]の崩れを無視して[['''構いません''']]。
信頼性や[[セキュリティー]]が重要な時はこれを選ぶ[['''べきではありません''']]。 [SRC[>>24]]

[36] [[XML処理器]]は入力を[[完全正規化済み]]形に変形しては[['''なりません''']]。
[[XML 1.1]] [[文書]]を作る[[応用]]は出力を[[完全正規化済み]]にする[['''べきです''']]。
[SRC[>>24]]

[37] [[正規化転符号化器]]を使う[['''べきです''']] [SRC[>>24]]。

* XML 1.0 における完全正規化済み形

[39] [[完全正規化済み]]形に関する規定は [[XML 1.1]] の変更点として扱われていて、 [[XML 1.0]]
には追加されていませんでした。その後、事実上 [[XML 1.1]] を廃止するものとして [[XML 1.0 5e]] 
が出版されましたが、[[完全正規化済み]]形の規定は含まれないままでした。

[40] しかし2009年9月になって[[正誤表]] [SRC[>>38]] によって[[完全正規化済み]]が「復活」しました。

[41] [[XML 1.1]] の規定とは違って簡潔で、コピペではなく [[Charmod]] の [[CR]] を参照しています。
「Note」なのに [['''SHOULD''']] を含むという不思議な形になっています。

;; [42] [[XML]] の仕様書では Note も [[normative]] なようです。

[43] [[XML 1.1]] とは違って[[関連する構造]]が何なのか定義されていません。

[44] [[XML 1.0]] [[構文解析対象実体]]は[[完全正規化済み]]である[['''べきです''']] [SRC[>>38]]。

[45] [[XML 1.0]] の[[XML処理器]]は[[完全正規化済み]]か検査して[['''構いません''']] [SRC[>>38]]。

* XDM における完全正規化済みテキスト

[1] [CITE@EN[XPath and XQuery Functions and Operators 3.0]]
( ([TIME[2014-04-08 07:02:07 +09:00]] 版))
<http://www.w3.org/TR/xpath-functions-3/#func-normalize-unicode>

[2] [CITE@en[XSLT and XQuery Serialization 3.0]]
( ([TIME[2014-04-07 23:19:15 +09:00]] 版))
<http://www.w3.org/TR/xslt-xquery-serialization-3/#XML_NORMALIZATION-FORM>

[21] [CITE@en[Extensible Markup Language (XML) 1.1 (Second Edition)]]
( ([TIME[2006-09-29 19:02:09 +09:00]] 版))
<http://www.w3.org/TR/2006/REC-xml11-20060816/#sec-CharNorm>

[47] [CITE@EN[XPath and XQuery Functions and Operators 3.1]]
([TIME[2017-03-21 16:02:06 +09:00]])
<https://www.w3.org/TR/2017/REC-xpath-functions-31-20170321/#func-normalize-unicode>

[48] [CITE@en[XSLT and XQuery Serialization 3.1]]
([TIME[2017-03-20 12:35:18 +09:00]])
<https://www.w3.org/TR/2017/REC-xslt-xquery-serialization-31-20170321/#XML_NORMALIZATION-FORM>

* メモ
