* 0F型エスケープシーケンス

[1] [DFN@en[[CODE[0F]]]] 型[[エスケープ・シーケンス]]は、
[[告知]] ([CODE(charname)@en[[[ANNOUNCE CODE STRUCTURE]]]])
に使われます。

[2]
仕様書:
- [[JIS X 0202]]:1998
--[CSECTION[表 3.b nF 型エスケープ・シーケンス及び対応機能]]

[3] '''構文''':
- [CODE(ABNF)[[DFN[エスケープ・シーケンス]] /= 0F 型エスケープ・シーケンス]]
- [CODE(ABNF)[[DFN[0F 型エスケープ・シーケンス]] := ACS / 0F 型予約エスケープ・シーケンス]]
- [CODE(ABNF)[[DFN@en[ACS]] := 標準 ACS / 私用 ACS [CODE(comment)[;; [CODE(charname)@en[[[ANNOUNCE CODE STRUCTURE]]]]]]]]
- [CODE(ABNF)[[DFN[標準 ACS]] := [CODE(charname)@en[[[ESC]]]] %x20 [[Ft]]]]
- [CODE(ABNF)[[DFN[私用 ACS]] := [CODE(charname)@en[[[ESC]]]] %x20 *[[I]] [[Fp]]]]
- [CODE(ABNF)[[DFN[0F 型予約エスケープ・シーケンス]] := [CODE(charname)@en[[[ESC]]]] %x20 1*[[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)[;; 標準終端バイト]]]]


* 告知 (ISO/IEC 2022)


[4] [[告知]] = [[符号構造機能の告知]]



:[[名前]]:[CODE(charname)@en[[[ANNOUNCE CODE STRUCTURE]]]]
:[[日本語通用名称]]:[CODE(jcharname)[[[符号構造アナウンス]]]]
:[[略号]]:[CODE(charname)@en[[[ACS]]]]
:[[符号化表現]]:[CODE(char)@en[[CODE(charname)@en[[[ESC]]]] 02/00 [VAR[[[F]]]]]]



[5] ISO/IEC 2022 の announce(r) を、 [[JIS X 0202]]:1998 はそのまま
[Q[アナウンス (アナウンサー)]]としているが、ここでは[Q[告知]]と訳す。

** 仕様書

[REFS[
- [6] [[ISO/IEC 2022]]:1994 15.2
- [8] [CITE[ECMA-35_6th_edition_december_1994.pdf]], [TIME[2021-01-16T09:57:02.000Z]], [TIME[2022-04-29T07:11:12.638Z]] <https://www.ecma-international.org/wp-content/uploads/ECMA-35_6th_edition_december_1994.pdf#page=47>
- [9] [[JIS X 0202]]:1998
-- [10] [CSECTION[15.2 符号構造機能のアナウンス]]
]REFS]

** 構文

[11] 構文 [SRC[>>6]]

- [CODE(ABNF)[[DFN[ACS]] := [CODE(char)[[[ESC]] %x20 [VAR[F]] ;; [[ANNOUNCE CODE STRUCTURE]]]]
- [CODE(ABNF)[[DFN[[VAR[F]]]] := %x41-7E  ;; 1 = [CODE(char)[4/1]], ..., 62 = [CODE(char)[7/14]]]]

[13] 
'''終端バイト''':
[[終端バイト]] [CODE(char)@en[[VAR[F]]]] は
1〜62 の番号が付けられており、 1 が
[CODE(char)[04/01]] に、 62 が [CODE(char)[07/14]]
によって[[表現]]されます。各番号の意味は [[ISO/IEC 2022]]
で規定されており、将来追加の機能が必要になったときは
[[ISO/IEC 2022]] が改訂されることが示唆されています。
登録制度はありません。
[SRC[>>10 15.2.2]]

** 文脈

[12] 
[[符号識別機能]]は、[[情報交換]]の開始時に[[文字符号化情報]]に埋込んで、
後続のデータで使用される[[符号構造機能]]を[RUBY[[[告知]]] @en[[[アナウンス]]]]します。
[SRC[>>10 15.1]]

[17] 
現実にはほとんど利用されている例は無いようです。

[18] 
通常[[情報交換]]の先頭で使うことが想定されますが、
使わなければならないものでもありません。
いつどう使うかは[[応用]]依存と思われます。

[19] 
先頭で使う想定なのに[[情報交換]]の中途で出現したときや、
使う想定がないのに出現したときや、
想定外の[[告知]]シーケンスが出現したときに、
どう扱うべきかは不明です。
[SEE[ [[ISO/IEC 2022]] のエラー処理の項 ]]

[20] 
実際の[[情報交換]]ではなく、
[[符号化文字集合]]を規定する[[仕様書]]において符号構造の説明のために使うことがあります。

[EG[
[21] 
例えば [[ISO-2022-JP]] を規定する [[RFC 1468]] 
の
[CSECTION[Background Information]]
の項に記述されています。
]EG]

[EG[
[41] [[ctext]] の仕様書にもあります。
]EG]

[59] 
[[ISO/IEC 2022 character transfer syntax]] では使えません。
[SRC[[[ISO/IEC 2022]] A.3.2]]

[60] 
[[GB 8565.2]] は[[告知シーケンス]]で[[7ビット符号]]と[[8ビット符号]]を区別するとしています。

[61] 
[[ISO-2022-ESC B]]

** 意味

,構造番号,[VAR[F]],使用する符号要素    ,シフト機能
,1  ,04/01,[[GL]] == [[G0]]   ,なし
,2  ,04/02,"GL = G0, [[G1]]     ","[CODE(char)[[[SI]]]]/[CODE(char)[[[LS0]]]], [CODE(char)[[[SO]]]]/[CODE(char)[[[LS1]]]]"
,3  ,04/03,"(8ビット) GL == G0, [[GR]] == G1",なし
,4  ,04/04,"(7ビット) 2と同じ / (8ビット) 3と同じ",==
,5  ,04/05,,7ビット・8ビット間変換で完全に保持
,6  ,04/06,[[C1]] == [CODE(char)[[[[[ESC]] [VAR[[[Fe]]]]]]]],[CODE(char)[ESC [VAR[Fe]]]]
,7  ,04/07,(7ビット) C1 == [CODE(char)[ESC Fe]] / (8ビット) C1 == [[CR]],
,8  ,04/08,[[図形文字集合]]は全て[[94集合]],
,9  ,04/09,G1〜[[G3]] は94集合または[[96集合]],
,10 ,04/10,7ビット,
,11 ,04/11,8ビット,
,12 ,04/12,[[ISO/IEC 4873]] [[実装水準]]1
,13 ,04/13,ISO/IEC 4873 実装水準2
,14 ,04/14,ISO/IEC 4873 実装水準3
,16 ,05/00,+G0             ,[CODE(char)[SI]]/[CODE(char)[LS0]]
,18 ,05/02,+G1             ,[CODE(char)[SO]]/[CODE(char)[LS1]]
,19 ,05/03,+G1             ,[CODE(char)[SO]]/[CODE(char)[[[LS1R]]]]
,20 ,05/04,+G2             ,[CODE(char)[[[LS2]]]]
,21 ,05/05,+G2             ,[CODE(char)[LS2]]/[CODE(char)[[[LS2R]]]]
,22 ,05/06,+G3             ,[CODE(char)[[[LS3]]]]
,23 ,05/07,+G3             ,[CODE(char)[LS3]]/[CODE(char)[[[LS3R]]]]
,26 ,05/10,+G2             ,[CODE(char)[[[SS2]]]]
,27 ,05/11,+G3             ,[CODE(char)[[[SS3]]]]
,28 ,05/12,[CODE(char)[[[SS2]]]]/[CODE(char)[[[SS3]]]] の後 [[GR]] を使用,

1,3,4と16,18〜23は併用不能, 12〜14は他と併用不能




[14] 
'''複数の組合せ''':
告知機能は複数回続けて使用できます
[SRC[[[JIS X 0202]]:1998 15.1]]。
しかし、幾つかの機能は同時に使用できないと規定されています
[SRC[>>10 15.2.2]]。

[15] 
,機能番号,終端バイト,機能 (7ビット),機能 (8ビット),同時使用禁止
,1,[CODE(char)[04/01]],"[[G0]] = [[GL]], ×[[固定シフト]]","[[G0]] = [[GL]], ×[[固定シフト]], ×[[GR]]","12, 13, 14, 16, 18〜23"
,2,[CODE(char)[04/02]],"[[G0]], [[G1]], [CODE(charname)@en[[[SI]]]], [CODE(charname)@en[[[SO]]]] >>8","[[G0]], [[G1]], [CODE(charname)@en[[[LS0]]]], [CODE(charname)@en[[[LS1R]]]] >>7","12, 13, 14"
,3,[CODE(char)[04/03]],"×[[G0]], ×[[G1]], ×[[固定シフト]]","[[G0]] = [[GL]], [[G1]] = [[GR]], ×[[固定シフト]]","12, 13, 14, 16, 18〜23"
,4,[CODE(char)[04/04]],"[[G0]], [[G1]], [CODE(charname)@en[[[SI]]]], [CODE(charname)@en[[[SO]]]] >>8","[[G0]] = [[GL]], [[G1]] = [[GR]], ×[[固定シフト]]","12, 13, 14, 16, 18〜23"
,5,[CODE(char)[04/05]],"7ビット・8ビットデータ変換。すべての[[シフト機能]]を維持。",==,"12, 13, 14"
,6,[CODE(char)[04/06]],"[[C1]] = [CODE(char)@en[[CODE(charname)@en[[[ESC]]]] [[Fe]]]]",==,"12, 13, 14"
,7,[CODE(char)[04/07]],"[[C1]] = [CODE(char)@en[[CODE(charname)@en[[[ESC]]]] [[Fe]]]]","[[C1]] = [[CR]]","12, 13, 14"
,8,[CODE(char)[04/08]],"[[図形文字集合]]は94文字",==,"12, 13, 14"
,9,[CODE(char)[04/09]],"[[図形文字集合]]は94文字[[及び/又は]]96文字",==,"12, 13, 14"
,10,[CODE(char)[04/10]],"[[7ビット符号]]だけを使用",==,"12, 13, 14"
,11,[CODE(char)[04/11]],,"[[8ビット符号]]を使用","12, 13, 14"
,12,[CODE(char)[04/12]],"[[ISO/IEC 4873]] 実装水準1",==,"13, 14"
,13,[CODE(char)[04/13]],"[[ISO/IEC 4873]] 実装水準2",==,"12, 14"
,14,[CODE(char)[04/14]],"[[ISO/IEC 4873]] 実装水準3",==,"12, 13"
,15,[CODE(char)[04/15]],(予約),==,"12, 13, 14"
,16,[CODE(char)[05/00]],"[[G0]], [CODE(charname)@en[[[SI]]]]","[[G0]], [CODE(charname)@en[[[LS0]]]]","1, 3, 4, 12, 13, 14"
,17,[CODE(char)[05/01]],(予約),==,"12, 13, 14"
,18,[CODE(char)[05/02]],"[[G1]], [CODE(charname)@en[[[SO]]]]","[[G1]], [CODE(charname)@en[[[LS1]]]]","1, 3, 4, 12, 13, 14"
,19,[CODE(char)[05/03]],"[[G1]], [CODE(charname)@en[[[SO]]]]","[[G1]], [CODE(charname)@en[[[LS1R]]]]","1, 3, 4, 12, 13, 14"
,20,[CODE(char)[05/04]],"[[G2]], [CODE(charname)@en[[[LS2]]]]","[[G2]], [CODE(charname)@en[[[LS2]]]]","1, 3, 4, 12, 13, 14"
,21,[CODE(char)[05/05]],"[[G2]], [CODE(charname)@en[[[LS2]]]]","[[G2]], [CODE(charname)@en[[[LS2R]]]]","1, 3, 4, 12, 13, 14"
,22,[CODE(char)[05/06]],"[[G3]], [CODE(charname)@en[[[LS3]]]]","[[G3]], [CODE(charname)@en[[[LS3]]]]","1, 3, 4, 12, 13, 14"
,23,[CODE(char)[05/07]],"[[G3]], [CODE(charname)@en[[[LS3]]]]","[[G3]], [CODE(charname)@en[[[LS3R]]]]","1, 3, 4, 12, 13, 14"
,24,[CODE(char)[05/08]],(予約),==,"12, 13, 14"
,25,[CODE(char)[05/09]],(予約),==,"12, 13, 14"
,26,[CODE(char)[05/10]],"[[G2]], [CODE(charname)@en[[[SS2]]]]",==,"12, 13, 14"
,27,[CODE(char)[05/11]],"[[G3]], [CODE(charname)@en[[[SS3]]]]",==,"12, 13, 14"
,28,[CODE(char)[05/11]],,[[単独シフト領域]]は [[GR]],
,29〜62,[CODE(char)[05/12]]〜[CODE(char)[07/14]],(予約),==,"12, 13, 14"

[16] 
2番は [[JIS X 0202]]:1998 で
[Q[[CODE(charname)@en[[[LS1]]]] が [[G1]] を [[GR]] に呼び出す]]
と書かれており、図も [CODE(charname)@en[[[LS1]]]]
になっていますが、[[右]]に[[呼出]]す
[WEAK[(図もそうなっています。)]] なら
[CODE(charname)@en[[[LS1R]]]] だと思われます。

[7] 
2番と4番は[[7ビット符号]]では同じですが、
変換前の[[8ビット符号]]の構造の情報を保存するために用意されています。
[SRC[>>10 15.2.2]]

[53] 
[[ISO/IEC 2022]]
では[[私用終端バイト]]は認められているようには読めませんが [SEE[ [[Fp]] ]]、
[[VT][VT100]]
で
3/6, 3/7
の利用例があります。
[SEE[ [[VT][VT100]] ]]

[57] [CITE[Digital Ansi-Compliant Print Protocol Lev 2 Program. Ref. Man. - PPLV2PMB.PDF]], [TIME[1995-08-31T14:32:02.000Z]], [TIME[2022-05-02T12:20:35.927Z]] <http://sup.xenya.si/sup/info/digital/MDS/jun99/Cd3/PRINTER/PPLV2PMB.PDF#page=103>

[CODE(charname)@en[DECTC1]] = [N[3/6]] → [[Fe]] を [[C1]] とする & [[CR]] を [[C0]] とする

[CODE(charname)@en[DECAC1]] = [N[3/7]] → [[CR]] & [[Fe]] を [[C1]] とする

** 処理

[22] 
告知シーケンスを受信した時、それをどう解釈することが期待されているのかは、
[[ISO/IEC 2022]] 仕様書上不明瞭です。

[23] 
[[情報交換]]の先頭で符号構造を明示することで、
[[装置]]が正しく処理できない[[符号化文字データ要素]]の出現が予想されるとき、
そのようなデータの受信を拒絶するような使い方が想定されているのでしょうか。
[SEE[ [[ISO/IEC 2022]] のエラー処理の項 ]]


[25] 
[[告知]]シーケンスの後に、それと矛盾する[[符号化文字データ要素]]が出現したとき、
[[装置]]が何をどうするべきなのかも不明です。
例えば [[G2]] を使用しないと定められているにも関わらず、
[[G2]] の[[指示シーケンス]]が出現したり、
[CODE(charname)@en[SS2]] が使われたりするとき、
何がなされるべきかは不明です。

[27] 
矛盾する複数の[[告知]]シーケンスを使用することは禁止されていますが、
それが出現したときの処理方法も不明です。

[26] 
符号構造を通知するだけで規定するものではないのですから、
矛盾しても通常通りに処理するのが穏当でしょうか。

[31] 
いくつかの[[告知]]は、[[固定シフト]]等を使用しない符号構造を決定するものとなっています。
[[ISO/IEC 2022]] を受信する実装が初期状態から[[符号]]の解釈が可能な状態に遷移する必要があると考えると、
次のような処理が必要となります。

- [37] [[GL]] に [[G0]] が[[呼び出し]]されているべきもの
-- [29] [N[1]] ([[4/1]])
-- [44] [N[3]] ([[4/3]])
-- [38] [N[12]] ([[4/12]]) 
-- [39] [N[13]] ([[4/13]])
-- [40] [N[14]] ([[4/14]])
- [45] [[GR]] に [[G1]] が[[呼び出し]]されているべきもの
-- [46] [N[3]] ([[4/3]])
-- [30] [N[12]] ([[4/12]]) 
-- [47] [N[13]] ([[4/13]])
-- [48] [N[14]] ([[4/14]])
- [43] [[GR]] は使用しないとされているもの
-- [42] [N[1]] ([[4/1]])
-- [24] [N[2]] ([[4/2]])
- [49] [CODE(charname)@en[SPACE]], [CODE(charname)@en[DELETE]] を使用するとされているもの
-- [50] [N[12]] ([[4/12]]) 
-- [51] [N[13]] ([[4/13]])
-- [52] [N[14]] ([[4/14]])
-
[28] 
[[7ビット符号]]と[[8ビット符号]]の区別は事実上これ以外に記述方法がないので、
[[7ビット符号]]と[[8ビット符号]]の挙動の切り替えのための[[エスケープシーケンス]]として解釈するべきとも思われます。
[SEE[ [[7ビット符号]], [[8ビット符号]] ]]
--
[32] 
[N[10]] ([[4/10]]) は[[7ビット符号]]を表します。
--
[33] 
[N[11]] ([[4/11]]) は[[8ビット符号]]を表します。
--
[34] 
[N[12]] ([[4/12]]) は[[8ビット符号]]を表します。
--
[35] 
[N[13]] ([[4/13]]) は[[8ビット符号]]を表します。
--
[36] 
[N[14]] ([[4/14]]) は[[8ビット符号]]を表します。


[55] 
[[ISO/IEC 2022]]
の標準の[[告知]]および
[[VT][VT100]]
の
[N[3/6]],
[N[3/7]]
は、いずれも
[[ISO/IEC 2022]]
の符号構造に関係する記述です。
[[ISO/IEC 2022]]
の[[符号化文字データ要素]]の列を解釈して他の形式に変換する場合には、
完全に除去してしまっても構わないと考えられます。


[54] [CITE[Xterm Control Sequences]], [TIME[2008-12-29T17:58:30.000Z]], [TIME[2022-05-01T01:26:55.798Z]] <https://www.xfree86.org/current/ctlseqs.html>

F, G, L, M, N に対応。


[56] [CITE[Digital Ansi-Compliant Print Protocol Lev 2 Program. Ref. Man. - PPLV2PMB.PDF]], [TIME[1995-08-31T14:32:02.000Z]], [TIME[2022-05-02T12:20:35.927Z]] <http://sup.xenya.si/sup/info/digital/MDS/jun99/Cd3/PRINTER/PPLV2PMB.PDF#page=92>

[N[4/12]], [N[4/13]], [N[4/14]] に対応: {GL = G0 = ASCII; GR = G1 = Latin-1}

;; [58] 副作用で[[指示]]するのは [[ISO/IEC 4873]] にない独自仕様。
現行 [[ISO/IEC 4873]] では [[G0]] が [[US-ASCII]] だが以前の版では制限が緩かった
([[ISO/IEC 646の版]]相当)。
[[G1]] は現行版でも制限なし。
[[ISO/IEC 4873]] は[[告知]]のあとすべて[[指示シーケンス]]を明示することを求めている。

[REFS[
[FIG(quote)[
[FIGCAPTION[
[149] 
[CITE[Very old fj.kanji discussion 13/622]], [TIME[2008-11-08T10:28:12.000Z]], [TIME[2023-08-01T14:15:23.579Z]] <https://ie.u-ryukyu.ac.jp/~kono/fj/fj.kanji/13.html>
]FIGCAPTION]

>  以上のように、使いたい図形文字セットをバッファに指示し、コード表へ呼[BR[]]
び出して使うのが正式なのだが、それは面倒という場合には、あるバッファは[BR[]]
あるコード表に直結していて、指示しただけで即使えるという方法もある。そ[BR[]]
れには使う前にアナウンサというのを送る。例えばESC 2/0 4/1を[BR[]]
送ると、これは「バッファはG0しか使わない、そのかわり、G0へ指示した[BR[]]
ものは7単位環境ではすぐコード表へ呼び出す。8単位ではG0へ指示したも[BR[]]
のを左のコード表へ呼び出す」という約束をする。アナウンサにはまだ沢山あ[BR[]]
るがそれはJIS C6228の8章を見てほしい。しかし上には上があって、[BR[]]
情報交換当事者間の合意があればアナウンサも省略してよいことになっている。

]REFS]

;; [62] この[[著者]]は当時この分野一線の専門家だった[[和田英一]]。

* メモ