[1] [DFN[CONTEXT]] ([DFN[CONTEXTUAL RULE REQUIRED]]、[DFN[文脈的規則必須]]) は、
その[[符号位置]]が[[ラベル]]では特定の[[文字]]や[[特性]]が満たされない限り利用でき''ない''ことを表す[[導出特性値]]です
[SRC[>>2]]。

* 仕様書

[REFS[
- [7] [CITE@en[RFC 5892 - The Unicode Code Points and Internationalized Domain Names for Applications (IDNA)]] 
-- [2] '''<https://tools.ietf.org/html/rfc5892#page-4>'''
-- [8] <https://tools.ietf.org/html/rfc5892#section-5.2>
- [32] [CITE@en[RFC 5894 - Internationalized Domain Names for Applications (IDNA): Background, Explanation, and Rationale]] 
-- [24] <https://tools.ietf.org/html/rfc5894#section-3.1.2>
-- [33] <https://tools.ietf.org/html/rfc5894#section-7.1.3>
- [10] [CITE[IDNA Parameters]]
<https://www.iana.org/assignments/idnabis-tables/idnabis-tables.xml#idnabis-tables-context>
- [36] [CITE@en[RFC 7564 - PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols]] ([TIME[2015-12-21 04:49:41 +09:00]] 版) <https://tools.ietf.org/html/rfc7564#section-8>
- [42] [CITE@en-us[UTS #46: Unicode IDNA Compatibility Processing]] ([TIME[2017-06-15 06:37:47 +09:00]]) <http://www.unicode.org/reports/tr46/#Processing>
]REFS]

* 分類

[37] [CODE[[[CONTEXT]]]] は、更に次の2つに分類されます。

[FIG(list)[
:[4] [DFN[[CODE[[[CONTEXTJ]]]]]] ([DFN[[CODE[[[CONTEXT-JOINER]]]]]]): 
[CODE[[[CONTEXT]]]] のうち、 [CODE[[[Join_controls]]]] に属するもの [SRC[>>2]]
:[5] [DFN[[CODE[[[CONTEXTO]]]]]] ([DFN[[CODE[[[CONTEXT-OTHER]]]]]]): 
[CODE[[[CONTEXT]]]] のうち、その他のもの [SRC[>>2]]
]FIG]

* 文脈的規則

[6] [[CONTEXT]] の[[符号位置]]が利用できるかどうかは、その[[ラベル]]の他の[[符号位置]]に依存します。
この利用できるかどうかを決定する規則を[DFN[[RUBYB[文脈的規則]@en[contextual rule]]]]と呼び、
[[IANA登録簿]] (>>10) が用意されています。

;; [9] [[IANA登録簿]]への追加や変更には [[IETF評価]]が必要です [SRC[>>8]]。

[21] [[IDNA2008]] では、
[[文脈的規則]]は[[登録]]の際に適用されます。[[lookup]] の際にも適用されるか否かは各規則によって異なります。

[38] [[PRECIS]] では、 [CODE[[[CONTEXT]]]] の[[文字]]は、
適切な規則が確立されており、その規則と整合する場合を除き、
使っては[['''なりません''']] [SRC[>>36]]。

[44] [[ラベル]]の[[妥当性基準]]では、 [[ContextJ rules]] のみ使われる場合があります。

-*-*-

[22] [[文脈的規則]]は、仕様上は[[擬似コード]]によって記述されており、
その[[符号位置]]が含まれる[[ラベル]]について評価した結果[[真]]、[[偽]]、[[未定義]]のいずれかが得られます。

** 文脈的規則の定義

[28] [[文脈的規則]]は定義されていることもあります ([DFN[[[DEFINED]]]]) し、
存在しないこと ([DFN[[[NULL]]]]、[DFN[null[RUBYB[規則][rule]]]]) もあります。 [SRC[>>24 3.1.2.2.]]

[29] ある[[文字]]が [[IDN]] に必要かどうか、[[ラベル]]のどこで認めるべきかは簡単には決められないので、
ある特定の版においては [[null]] としても構いません。もちろん、改訂版において [[null]]
でない[[文脈的規則]]を定めても構いません。 [SRC[>>24 3.1.2.2.]]

** 文脈的規則の値

[27] [[文脈的規則]]がある場合には、その値が
- [[真]] ([[ラベル]]のどこでも使ってよい)
- [[偽]] ([[ラベル]]のどこでも使ってはいけない)
- [[手続き]]によって使って良い条件が定まる

... のいずれかとなります。 [SRC[>>24 3.1.2.2.]]

** 文脈的規則の一覧

[11] 
現在、次の[[符号位置]]に対して[[文脈的規則]]が定義されています [SRC[>>10]]。 [TIME[2011-03-29T14:09:24.000Z]]

;; [23] [[Unicode 5.2]] における [[CONTEXT]] な[[符号位置]]のすべてに対して[[文脈的規則]]が定義されています。
[[null規則]]となっている[[符号位置]]はありません。

*** CONTEXTJ の文脈的規則

- [18] [CODE(char)[[[U+200C]]]] [CODE(charname)@en[[[ZERO WIDTH NON-JOINER]]]]
- [19] [CODE(char)[[[U+200D]]]] [CODE(charname)@en[[[ZERO WIDTH JOINER]]]]

*** CONTEXTO の文脈的規則

- [12] [CODE(char)[[[U+00B7]]]] [CODE(charname)@en[[[MIDDLE DOT]]]]
- [13] [CODE(char)[[[U+0375]]]] [CODE(charname)@en[[[GREEK LOWER NUMERAL SIGN (KERAIA)]]]]
- [14] [CODE(char)[[[U+05F3]]]] [CODE(charname)@en[[[HEBREW PUNCTUATION GERESH]]]]
- [15] [CODE(char)[[[U+05F4]]]] [CODE(charname)@en[[[HEBREW PUNCTUATION GERSHAYIM]]]]
- [16] [CODE(char)[[[U+0660]]]] ... [CODE(char)[[[U+0669]]]] [CODE(charname)@en[[[ARABIC-INDIC DIGITS]]]]
- [17] [CODE(char)[[[U+06F0]]]] ... [CODE(char)[[[U+06F9]]]] [CODE(charname)@en[[[EXTENDED ARABIC-INDIC DIGITS]]]]
- [20] [CODE(char)[[[U+30FB]]]] [CODE(charname)@en[[[KATAKANA MIDDLE DOT]]]]

* 安定性

[30] [[PVALID]] や [[UNASSIGNED]] は、それに分類された[[文字]]が違う[[導出特性値]]に変更されることはないとされていますが、
[[CONTEXT]] ではそのような説明がされていません。

[31] また、[[文脈的規則]]の定義の変更による互換性についても特に説明されていません。

* [VAR[CheckJoiners]] フラグ

[43] [[ToASCII]] や [[ToUnicode]] の[[入力]] [DFN[[VAR[CheckJoiners]]]] [SRC[>>42]]
は、 [CODE[CONTEXTO]] 規則の適用の可否を指定する [[boolean]] です。

* 歴史

[34] 元々の [[RFC 5892]] の定義は [[Unicode]] 5.2.0 に拠っています。

[35] 2011年8月に [[IANA]] 登録簿 (>>10) が更新されて [[Unicode]] 6.0.0 に対応していますが、
[[文脈的規則]]は変更されていません。

* メモ

[3] [[CONTEXT]] に分類されている[[符号位置]]は、特定の文脈で不可視であるなどの性質から無条件に利用を認めることができ''ない''ものとなっています 
[SRC[>>2]]。

[25] [[CONTEXT]] の制約は、混乱を引き起こすおそれがある[[文字]]の用法を完全に制限することを目的としたものではなく、
[[ゾーン管理者]]が十分知識を持たない[[用字系]]でのみ有用な、それ以外では有害な[[文字]]の使用を限定することを目指したもののようです。 [SRC[>>24]]

;; [26] 例えば [CODE(charname)@en[[[ZERO WIDTH JOINER]]]] は[[インド系諸文字]]と共に使われますが、
[[ラテン文字]]と一緒には使いません。主に[[ラテン文字]]を扱う[[ゾーン]]の管理者はこの[[文字]]の取り扱いについて十分な知識を持っていないでしょう。
主に[[インド系諸文字]]を扱う[[ゾーン]]の管理者なら、どこでは使っても良くどこでは使う必要がない、使ってはいけないかを判断できる可能性が高いです。したがって[[ラテン文字]]の[[ゾーン]]の管理者が気にしなくても良い程度に利用を制限するのが [[CONTEXT]] の制約の趣旨のようです。

[39] [CITE@en[IDNA: use proposed UTS46 flags to avoid breaking YouTube]]
([[annevk]]著, [TIME[2017-06-02 06:24:01 +09:00]])
<https://github.com/whatwg/url/commit/dc9d83106cada9af507bf37dee3973de97b020fd>

[40] [CITE@en[IDNA / UTS #46 "should" requirements (Bidi and Joiners) · Issue #110 · whatwg/url]]
([TIME[2017-09-03 21:20:40 +09:00]])
<https://github.com/whatwg/url/issues/110>

[41] [CITE@en[Address several IDNA issues by annevk · Pull Request #309 · whatwg/url]]
([TIME[2017-09-03 21:25:52 +09:00]])
<https://github.com/whatwg/url/pull/309>