* 仕様書

[REFS[
- [5] [[ISO-IR]], [TIME[2014-06-23T06:27:15.000Z]], [TIME[2020-12-05T05:40:34.990Z]] <https://www.itscj.ipsj.or.jp/itscj_english/iso-ir/ISO-IR.pdf#page=29>
- [7] [CITE[Character Sets: [[MARC-8]] Encoding Environment: MARC 21 Specifications for Record Structure, Character Sets, and Exchange Media (Library of Congress)]], [TIME[2007-12-05T16:31:01.000Z]], [TIME[2020-12-05T05:57:48.466Z]] <https://www.loc.gov/marc/specifications/speccharmarc8.html#technique1>
]REFS]

* 符号化単独追加制御機能

[9] [DFN[符号化単独追加制御機能]]の種類 [SRC[[[JIS X 0202]]:1998 6.5]]:

- [[標準単独制御機能]]
- [[登録単独制御機能]]
- [[私用制御機能]]

[10] >>9 は標準化の程度に拠る分類ですが、
それに合わせて[[符号化表現]] (いずれも[[エスケープ・シーケンス]])
に違いがあります。

[11] 
[[単独制御機能]]は
[[ISO/IEC2022]]:1994 6.5, [[ISO/IEC6429]]:1991 5.5 で規定されています。

=additional-control-functions = ESC-Fs / ESC-3Ft / private-control-functions
=ESC-Fs = ESC %x60-7E        ;; Standardized single control function
=ESC-3Ft = ESC %x23 [I] Ft   ;; Registered single control function
=I = %x21-23
=Ft = %x40-7E
=private-control-functions = ESC-Fp / ESC-3Fp
=ESC-Fp = ESC Fp
=ESC-3Fp = ESC %23 [I] Fp
=Fp = %x30-3F

[12] 標準化された単独制御機能 (Fs) は、 [[ISO/IEC]] JTC1/SC2
の承認が必要です。 Fs と 3Ft は [[ISO-IR]] に登録が必要です。

,*  ,*2                 ,*3   ,*4     ,*5     ,*6  ,*7
,*0 ,ACS [[告知]]      ,私用,[[C1]],[[C1]],[[DMI]],"[[PCD]] † ☆"
,*1 ,CZD [[指示]]      ,私用,[[C1]],[[C1]],[[INT]],
,*2 ,C1D [[指示]]      ,私用,[[C1]],[[C1]],[[EMI]] ☆,† ☆
,*3 ,単独制御機能      ,私用,[[C1]],[[C1]],[[RIS]] ☆,†
,*4 ,多バイト[[指示]]  ,私用,[[C1]],[[C1]],[[CMD]] ※ ☆,
,*5 ,[[DOCS]]          ,私用,[[C1]],[[C1]],☆,
,*6 ,[[IRR]]           ,私用,[[C1]],[[C1]],☆,
,*7 ,                  ,私用,[[C1]],[[C1]],†,☆
,*8 ,GZD4 [[指示]]     ,私用,[[C1]],[[C1]],,☆
,*9 ,G1D4 [[指示]]     ,私用,[[C1]],[[C1]],,
,*10,G2D4 [[指示]]     ,私用,[[C1]],[[C1]],☆,
,*11,G3D4 [[指示]]     ,私用,[[C1]],[[C1]],[[LS1R]] ※ ☆,※
,*12,(GZD6 [[指示]])   ,私用,[[C1]],[[C1]],[[LS2R]] ※ ☆,[[LS3R]]
,*13,G1D6 [[指示]]     ,私用,[[C1]],[[C1]],[[LS3R]],[[LS2R]]
,*14,G2D6 [[指示]]     ,私用,[[C1]],[[C1]],[[LS2]],[[LS1R]]
,*15,G3D6 [[指示]]     ,私用,[[C1]],[[C1]],[[LS3]] ☆,----

[31] 
※ は [[VT][VT100]] で他の意味で使われる。
☆ は [[VT52][VT100]] で他の意味で使われる。

[32] 
† は [[MARC-8]] で[[指示][指示シーケンス]]に使われる。

[29] [DFN[Fe]] = 4/[VAR[*]], 5/[VAR[*]] は [[C1]] に使われます。

* 標準単独制御機能

[1] [DFN[標準単独制御機能]]は[[符号化単独追加制御機能]]の一種です。

** 構文

[2] 
[CODE(char)[[[Fs]]]] 型の[[エスケープ・シーケンス]]、すなわち
[CODE(char)[[CODE(charname)[[[ESC]]]] [VAR[Fs]]]]
で[[表現]]します [SRC[[[JIS X 0202]]:1998 6.5.1]]。
ここで、 [CODE(char)[[VAR[Fs]]]] は [[ISOREG]] 
に登録された[[終端バイト]]
([CODE(char)[06/00]]〜[CODE(char)[07/14]]) です。

[6] [[ISO-IR]] の[[終端バイト]] [VAR[Fs]] には次のものがあります。 [SRC[>>5]]
なお [[MARC-8]] は非標準の独自の[[エスケープシーケンス]]を使っており、
一部が衝突しています。 [SRC[>>7]]

- [CODE[6/0]]: 
[CODE(charname)@en[DISABLE MANUAL INPUT]] ([CODE(charname)@en[DMI]]),
[[ISO/IEC 6429]],
[[ISO-IR]] 32
- [CODE[6/1]]: 
[CODE(charname)@en[INTERRUPT]] ([CODE(charname)@en[INT]]),
[[ISO/IEC 6429]],
[[ISO-IR]] 33
- [CODE[6/2]]: 
[CODE(charname)@en[ENABLE MANUAL INPUT]] ([CODE(charname)@en[EMI]]),
[[ISO/IEC 6429]],
[[ISO-IR]] 34
-- [[MARC-8]]: Subscript set に固定
- [CODE[6/3]]: 
[CODE(charname)@en[RESET TO INITIAL STATE]] ([CODE(charname)@en[RIS]]),
[[ISO/IEC 6429]],
[[ISO-IR]] 35
- [CODE[6/4]]: 
[CODE(charname)@en[CODING METHOD DELIMITER]] ([CODE(charname)@en[CMD]]),
[[ISO/IEC 6429]],
[[ISO-IR]] 189
- [CODE[6/5]]: [[ISO-IR]] 未割当
- [CODE[6/6]]: [[ISO-IR]] 未割当
- [CODE[6/7]]: [[ISO-IR]] 未割当
-- [[MARC-8]]: Greek Symbol set に固定
- [CODE[6/8]] - [CODE[6/10]]: [[ISO-IR]] 未割当
- [CODE[6/11]]: [[ISO-IR]] 未割当
-- [[NAPLPS]]: 旧 [CODE(charname)@en[LS1R]]
- [CODE[6/12]]: [[ISO-IR]] 未割当
-- [[NAPLPS]]: 旧 [CODE(charname)@en[LS2R]]
- [CODE[6/13]]: [[ISO-IR]] 未割当
-- [[NAPLPS]]: 旧 [CODE(charname)@en[LS3R]]
- [CODE[6/14]]: 
[CODE(charname)@en[LOCKING-SHIFT TWO]] ([CODE(charname)@en[LS2]]),
[[ISO/IEC 2022]],
[[ISO-IR]] 62
- [CODE[6/15]]: 
[CODE(charname)@en[LOCKING-SHIFT THREE]] ([CODE(charname)@en[LS3]]),
[[ISO/IEC 2022]],
[[ISO-IR]] 63
- [CODE[7/0]]: [[ISO-IR]] 未割当、予約
[SEE[ [[終端バイト]], [[PCD]] ]]
-- [[ISO-IR]] 予約
-- [[ISO 9281-1]]: [CODE(charname)@en[PCD]]
-- [[MARC-8]]: Superscript set に固定
- [CODE[7/1]]: [[ISO-IR]] 未割当
- [CODE[7/2]]: [[ISO-IR]] 未割当
- [CODE[7/3]]: [[ISO-IR]] 未割当
-- [[MARC-8]]: [[ASCII]] default character set に固定
- [CODE[7/4]] - [CODE[7/11]]: [[ISO-IR]] 未割当
- [CODE[7/12]]: 
[CODE(charname)@en[LOCKING-SHIFT THREE RIGHT]] ([CODE(charname)@en[LS3R]]),
[[ISO/IEC 2022]],
[[ISO-IR]] 64
- [CODE[7/13]]: 
[CODE(charname)@en[LOCKING-SHIFT TWO RIGHT]] ([CODE(charname)@en[LS2R]]),
[[ISO/IEC 2022]],
[[ISO-IR]] 65
- [CODE[7/14]]: 
[CODE(charname)@en[LOCKING-SHIFT ONE RIGHT]] ([CODE(charname)@en[LS1R]]),
[[ISO/IEC 2022]],
[[ISO-IR]] 66


** 標準化手続き

[3] 
[[標準単独制御機能]]は、 [[ISO/IEC]] [[JTC 1/SC 2]]
で承認された後、 [[ISO 2375]] に従って [[ISOREG]]
に登録されます。通常はその後、 [[ISO]] または [[ISO]] 
[[承認団体]]の[[規格]]として出版されます。
[SRC[[[JIS X 0202]]:1998 6.5.1]]

[4] >>2, >>3 のように、
[[制御機能]]の中では[[制御文字]]に次いで短い[[表現]]を与えられる分、
[[JTC 1/SC 2]] の承認という比較的高いハードルが設けられています。
実際には [[ISO/IEC 2022]] を構成する [CODE(charname)[[[LS1R]]]]
などの重要な[[制御機能]]が[[割当]]てられています。


* 登録単独制御機能

[15] [DFN[登録単独制御機能]]は、[[符号化単独追加制御機能]]の一種です。

[17] '''符号化表現''':
登録単独制御機能は [CODE(char)[[[3Ft]]]] 型[[エスケープ・シーケンス]]、
すなわち 
[CODE(char)[[CODE(charname)[[[ESC]]]] [CODE(char)[02/03]] [VAR[I]]* [VAR[Ft]]]]
で[[表現]]されます [SRC[[[JIS X 0202]]:1998 6.5.2]]。
ここで、 [CODE(char)[[VAR[Ft]]]]
は[[終端バイト]]で [CODE(char)[04/00]]〜[CODE(char)[07/15]] です。
[CODE(char)[[VAR[I]]]] は[[中間バイト]]ですが、
今のところ使われていませんし、今後も使われそうにありません。

[18] '''標準化''': 
登録単独制御機能は [[ISOREG]] に登録して使います 
[SRC[[[JIS X 0202]]:1998 6.5.2]]。

[24] 
この方式で [[ISO-IR]] に登録されている[[制御機能]]はありません。
今後も登録されることはないと思われます。

[33] 
[[Videotex]] は

- ESC 2/3 2/0 Fe
- ESC 2/3 2/1 Fe

... を使っていました。 [[Fe]] は [ [N[4/0]], [N[5/15]] ]。

* 私用制御機能

[8] [DFN[私用制御機能]]は[[符号化単独追加制御機能]]の一種で、
標準化された意味を持たないものです。
[[情報交換]]の当事者間の合意で[[私用]]できます
[SRC[[[JIS X 0202]]:1998 6.5.3]]。

[13] '''符号化表現''':
[CODE(char)[[[Fp]]]] 型または [CODE(char)[[[3Fp]]]] 型の[[エスケープ・シーケンス]]、
すなわち [CODE(char)[[CODE(charname)[[[ESC]]]] [VAR[Fp]]]]
または [CODE(char)[[CODE(charname)[[[ESC]]]] [CODE(char)[02/03]] [VAR[I]]* [VAR[Fp]]]]
によって[[表現]]します [SRC[[[JIS X 0202]]:1998 6.5.3]]。
ここで、 [CODE(char)[[VAR[Fp]]]] は[[私用終端バイト]]で
[CODE(char)[03/00]]〜[CODE(char)[03/15]] です。
[CODE(char)[[VAR[I]]]] は[[中間バイト]]です。

[14] すなわち、[[標準単独制御機能]]や[[登録単独制御機能]]の[[エスケープ・シーケンス]]で[[終端バイト]]に
[CODE(char)[03/00]]〜[CODE(char)[03/15]]
は自由に使っても良いということです。

[26] 
[[ctext]] は[[仕様の版に対する要件の記述][版付け]]に使っていました。
[SEE[ [[ctext]] ]]

- [VAR[[DFN[can-ignore]]]] := [CODE(charname)@en[ESC]] 2/3 [VAR[V]] 3/0
- [VAR[[DFN[cannot-ignore]]]] := [CODE(charname)@en[ESC]] 2/3 [VAR[V]] 3/1

[27] ここで [VAR[V]] は 2/[VAR[m]] で、 
仕様の第[VAR[n]]版のとき [VAR[m]] = [VAR[n]] - 1 とします。
[[終端バイト]]が 3/0 なら第[VAR[n]]版の拡張を無視しても良いことを、
3/1 なら第[VAR[n]]版の拡張を無視してはいけないことを表します。

;; [28] これまで、拡張された版が規定されたことはありません。
これらの[[エスケープシーケンス]]も利用例はないと思われます。


[42] 
[[VT][VT100]] 
では
[[3F]] 型の[[私用制御機能]]
[N[3/3]] - [N[3/9]]
が使われています。
[SEE[ [[VT][VT100]] ]]

[30] 
[[VT][VT100]] 
では
[N[3/1]] - [N[3/9]], [N[3/12]] - [N[3/15]]
が使われています
([N[3/1]], [N[3/2]] は2種類)。
[SEE[ [[VT][VT100]] ]]

[54] 
Tektronix 4014 
では
[CODE(charname)@en[ESC]] [N[3/8]] - [N[3/11]] 
が使われていました。
[SEE[ [[VT][VT100]] ]]

-*-*-

[16] 
[[Mule]] は[[文字]]の[[合成]]の情報を保持するために
[CODE(char)[[CODE(charname)[[[ESC]]]] 03/00]] -
[CODE(char)[[CODE(charname)[[[ESC]]]] 03/04]] を使っていました。
[SRC[>>25]]

[35] >>25

>
[PRE[
	o ESC '0' -- start relative composition
	o ESC '1' -- end composition
	o ESC '2' -- start rule-base composition (*)
	o ESC '3' -- start relative composition with alternate chars  (**)
	o ESC '4' -- start rule-base composition with alternate chars  (**)
]PRE]


[34] [[Mule-UCS]] の [CODE[utibetan.el]] に >>16 を使ったものがあります。

[SEE[ [[Muleの文字合成]] ]]

[REFS[
- [25] 
[CITE@en[src/coding.c · master · emacs / emacs · GitLab]], [TIME[2022-04-30T05:49:15.000Z]] <https://emba.gnu.org/emacs/emacs/-/blob/master/src/coding.c#L2811>
]REFS]

* 3F型エスケープシーケンス

[19] [DFN@en[[CODE[3F]]]] 型[[エスケープ・シーケンス]]は、
[[符号化単独追加制御機能]]のうち、
[[登録単独制御機能]]と[[私用制御機能]]に使われます。

[20] 
仕様書:
- [[JIS X 0202]]:1998
-- [CSECTION[表 3.b nF 型エスケープ・シーケンス及び対応機能]]

[21] '''構文''':
- [CODE(ABNF)[[DFN[エスケープ・シーケンス]] /= 3F 型エスケープ・シーケンス]]
- [CODE(ABNF)[[DFN[3F 型エスケープ・シーケンス]] := 登録単独制御機能 / 私用単独制御機能 / 3F 型予約エスケープ・シーケンス]]
- [CODE(ABNF)[[DFN[登録単独制御機能]] := [CODE(charname)@en[[[ESC]]]] %x23 [%x21-23 *[[I]]__&&]&&__ [[Ft]]]]
- [CODE(ABNF)[[DFN[私用単独制御機能]] := [CODE(charname)@en[[[ESC]]]] %x21 *[[I]] [[Fp]]]]
- [CODE(ABNF)[[DFN[3F 型予約エスケープ・シーケンス]] := [CODE(charname)@en[[[ESC]]]] %x21 (%x20 / %x24-2F) *[[I]] [[Ft]]]]
- [CODE(ABNF)[[DFN@en[I]] := %x20-2F [CODE(comment)[;; 中間バイト]]]]
- [CODE(ABNF)[[DFN@en[Fp]] := %x30-3F [CODE(comment)[;; 私用終端バイト]]]]
- [CODE(ABNF)[[DFN@en[Ft]] := %x40-7E [CODE(comment)[;; 標準終端バイト]]]]

[22] '''標準単独制御機能''':
[[標準単独制御機能]]は [CODE@en[[[Fs]]]] 
型[[エスケープ・シーケンス]]で[[表現]]します。

[23] 
'''私用制御機能の別の表現''': [[私用制御機能]]には
[CODE@en[[[Fp]]]] 型[[エスケープ・シーケンス]]を使うこともできます。



* メモ