[32] 
[DFN[[CODE(charname)@en[DOCS]]]]
([DFN[[CODE(charname)@en[DESIGNATE OTHER CODING SYSTEM]]]])
は、
[[ISO/IEC 2022]] や
[[ISO/IEC 2022]] 以外の[[文字コード]]体系を相互に切り替える[[エスケープシーケンス]]です。

* 意味

[37] 
[CODE(charname)@en[[[DOCS]]]] は [[ISO/IEC 2022]]
以外の[[符号化システム]]を[[指示]]し、同時に[[呼出]]すことができます。
他の[[符号化システム]]は[[文字符号]]以外のものも構いません。
[SRC[[[JIS X 0202]]:1998 15.4.1]]


* 構文

[35] 
:[[名前]]:[CODE(charname)@en[[[DESIGNATE OTHER CODING SYSTEM]]]]
:[[日本語通用名称]]:[CODE(jcharname)[[[他の符号化システムの指示]]]]
:[[略号]]:[CODE(charname)@en[[[DOCS]]]]
:[[符号化表現]]:[CODE(char)@en[[CODE(charname)@en[[[ESC]]]] 02/05 *[VAR[[[I]]]] [VAR[[[F]]]]]]

[36] 
仕様書:
- [[JIS X 0202]]:1998
-- [CSECTION[15.4 他の符号化システムの指示 (DOCS)]]



[39] 
'''終端バイト''':
[[符号化システム]]は (必要なら[[中間バイト]]と)
[[終端バイト]]で識別されます。
[[終端バイト]] [[Ft]] は [[ISO-IR]] 
に登録されます。





[34] 
[[ISO/IEC2022]] 1994 15.4

=DOCS = ESC %x25 [I] F  ;; DESIGNATE OTHER CODING SYSTEM
=I = I-foreign / %x20-2E
=I-foreign = %x2F
=F = %x40-%x7E

ISO/IEC 2022 に適合しない符号化体系 Coding System
を指示・呼び出ししたり、 ISO/IEC 2022 に戻ってきたりします。

=return-to-ISO2022 = ESC %x25 %x40

ESC 02/05 04/00 で戻ってきたときには、[[告知]], [[指示]],
[[呼び出し]]の状態は元に戻ります。[[現在位置]]など他の状態が
戻るかは未定義です。

中間バイトが 02/15 の時は、呼び出された符号化体系は
ISO/IEC 2022 に復帰するのに return-to-ISO2022 を使いません。
他の方法で戻ってきたとしても上述の状態も戻るかは未定義ですし、
そもそも戻る方法が無いかもしれません。

他の中間バイトを使うか、または中間バイト無しの時は、
return-to-ISO2022 を使って ISO/IEC 2022 に復帰できます。

[17] [DFN@en[[CODE[5F]]]] 型[[エスケープ・シーケンス]]は、
[[符号化システム]]の[[指示]]
([CODE(charname)@en[[[DESIGNATE OTHER CODING SYSTEM]]]])
に使われます。

[18] 
仕様書:
- [[JIS X 0202]]:1998
--[CSECTION[表 3.b nF 型エスケープ・シーケンス及び対応機能]]


[19] 
- [CODE(ABNF)[[DFN[エスケープ・シーケンス]] /= 5F 型エスケープ・シーケンス]]
- [CODE(ABNF)[[DFN[5F 型エスケープ・シーケンス]] := DOCS / 5F 型予約エスケープ・シーケンス]]
- [CODE(ABNF)[[DFN@en[DOCS]] := 標準 DOCS / 私用 DOCS [CODE(comment)[;; [CODE(charname)@en[[[DESIGNATE OTHER CODING SYSTEM]]]]]]]]
- [CODE(ABNF)[[DFN[標準 DOCS]] := [CODE(charname)@en[[[ESC]]]] %x25 [%x2F__&&]&&__ [%x21-23 *[[I]]__&&]&&__ [[Ft]]]]
- [CODE(ABNF)[[DFN[私用 DOCS]] := [CODE(charname)@en[[[ESC]]]] %x25 *[[I]] [[Fp]]]]
- [CODE(ABNF)[[DFN[5F 型予約エスケープ・シーケンス]] := [CODE(charname)@en[[[ESC]]]] %x21 (%x20 / %x24-2E / %x2F (%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)[;; 標準終端バイト]]]]







* 標準復帰あり DOCS (ESC 02/05 Ft)

[44] 
[CODE(charname)@en[ESC]] [N[2/5]] [VAR[F]] 
は[[標準復帰]]で
[[ISO/IEC 2022]]
に切り替えられるものとされます。

,*ESC 02/05,*2,*3,*4  ,*5  ,*6  ,*7
,0        ,I,return,ISO 2022
,1        ,moe,,108
,2        ,,,178
,3        ,,,131
,4        ,,NAPLPS,145
,5        ,,,160
,6        ,,,161
,7        ,,,196
,8        ,,※,188
,9        ,,,
,10       ,,,
,11       ,,,
,12       ,,,
,13       ,,Proprinter,
,14       ,,,
,15       ,n/s,,   ,   ,   ,---

,*[[ISO-IR]],*[[エスケープシーケンス]],*符号化システム
,---,ESC 02/05 04/00,[[ISO/IEC 2022]]
,108,ESC 02/05 04/01,[[NAPLPS]]
,178,ESC 02/05 04/02,[[UTF-1]]
,131,ESC 02/05 04/03,Data Syntax I of [[CCITT]] Rec. T.101.
,145,ESC 02/05 04/04,Data Syntax II of CCITT Rec. T.101.
,160,ESC 02/05 04/05,Photo-Videotex Data Syntax of CCITT Recommendation T.101.
,161,ESC 02/05 04/06,Audio Data Syntax of CCITT Recommendation T.101.
,196,ESC 02/05 04/07,[[UTF-8]] with standard return (実装水準指定なし)
,186,ESC 02/05 04/08,VEMMI Data Syntax of (draft) ITU-T Recommendation
,   ,ESC 02/05 05/[VAR[hh]],[[T.100]] >>113


* 標準復帰なしのDOCS (ESC 02/05 02/15 Ft)

[45] 
[CODE(charname)@en[ESC]] [N[2/5]] [N[2/15]] [VAR[F]] 
は[[標準復帰]]で
[[ISO/IEC 2022]]
に切り替えられ''ない''ものとされます。

,*ESC 02/05 02/15,*3,*4  ,*5  ,*6  ,*7
,0        ,xseg,162
,1        ,xseg,163
,2        ,xseg,125
,3        ,xseg,174
,4        ,xseg,175
,5        ,(xseg),176
,6        ,(xseg),177
,7        ,(xseg),190
,8        ,(xseg),191
,9        ,(xseg),192
,10       ,(xseg),193
,11       ,(xseg),194
,12       ,(xseg),195
,13       ,(xseg),
,14       ,(xseg),
,15       ,(xseg),   ,   ,   ,---

,*[[ISO-IR]],*[[エスケープシーケンス]],*符号化システム,*[[ISO/IEC 2022]] 復帰
,162,ESC 02/05 02/15 04/00,"ISO/IEC 10646:1993, UCS-2, Level1",ESC U+0025 U+0040
,163,ESC 02/05 02/15 04/01,"ISO/IEC 10646:1993, UCS-4, Level1",ESC U+0025 U+0040
,125,ESC 02/05 02/15 04/02,Virtual Terminal Service Transparent Set,復帰なし
,174,ESC 02/05 02/15 04/03,"ISO/IEC 10646:1993, UCS-2, Level2",ESC U+0025 U+0040
,175,ESC 02/05 02/15 04/04,"ISO/IEC 10646:1993, UCS-4, Level2",ESC U+0025 U+0040
,176,ESC 02/05 02/15 04/05,"ISO/IEC 10646:1993, UCS-2, Level3",ESC U+0025 U+0040
,177,ESC 02/05 02/15 04/06,"ISO/IEC 10646:1993, UCS-4, Level3",ESC U+0025 U+0040
,190,ESC 02/05 02/15 04/07,"UTF-8 level 1, without standard return",ESC U+0025 U+0040
,191,ESC 02/05 02/15 04/08,"UTF-8 level 2, without standard return",ESC U+0025 U+0040
,192,ESC 02/05 02/15 04/09,"UTF-8 level 3, without standard return",ESC U+0025 U+0040
,193,ESC 02/05 02/15 04/10,"UTF-16 level 1, without standard return",ESC U+0025 U+0040
,194,ESC 02/05 02/15 04/11,"UTF-16 level 2, without standard return",ESC U+0025 U+0040
,195,ESC 02/05 02/15 04/12,"UTF-16 level 3, without standard return",ESC U+0025 U+0040


[2] [[終端バイト]] [[7/14]] については[[空集合 (ISO/IEC 2022)]]参照。

[117] 
[[Unicode]] になる前の [[DIS 10646]] は、本来4オクテットの符号を[[符号短縮法]]により2オクテットに縮小することを表す、

[CODE(charname)@en[ESC]] [N[2/5]] [N[2/15]] [VAR[F2]] 
[CODE(charname)@en[HOP]] [CODE(charname)@en[HOP]] [VAR[G]] [VAR[P]]

という[[エスケープシーケンス]]があったそうです。
[VAR[F2]] は未定の[[終端バイト]]。
[CODE(charname)@en[HOP]] は [N[8/1]]。
[VAR[G]], [VAR[P]] は[[群]]と[[面]]。
(この[[エスケープシーケンス]]は7ビットまたは8ビットの8オクテット列でいいのか、
4オクテット符号の合計32オクテット列になるのかわかりません。)

他にも[[符号短縮法]]があったそうで、それぞれ[[終端バイト]]が予定されていたと思われます。


[125] 
02N3140
で
ISO-IR 210 (案)
[CITE[Sami complete 8-bit graphic character set no. 1.]],
02N3141
で
ISO-IR 211 (案)
[CITE[Sami complete 8-bit graphic character set no. 2.]]
として
[[CR]]
にも[[図形文字]]を定義した[[8ビット符号]]が [[SC2]] に送付されたものの、
なぜか登録されなかった模様。



* 旧仕様の DOCS (終端バイトと符号のビット数)

[10] 
初期の [[ISO 2022]] 
では[[終端バイト]]が[[指示]]・[[呼び出し]]する[[符号]]の[[ビット数]]によって割り当てることになっていました。
すなわち、
[SRC[>>9]]

- 3/[VAR[c]] ([VAR[[[Fp]]]]) - 任意のビット数
- 4/[VAR[c]] - 7ビット[[未満]]
- 5/[VAR[c]] - 7ビット
- 6/[VAR[c]] - 8ビット
- 7/[VAR[c]] - 8ビット[[超]]

[11] 
ビット長の異なるデータをどのように混在させる想定だったのかは不明です。

[12] 
当時の [[ISO 2022]] には [[ISO 2022]] への復帰のシーケンスが規定されていませんでした。
[[ISO 2022]] 自身の[[7ビット符号]]と[[8ビット符号]]の切り替えの方法も用意されていませんでした。

;; [33] 標準復帰あり・なしの概念もありませんでした。

[16] 
[[JIS X 4151]]
が
[SAMP(SGML)[ESC 2/5 4/0]] を未登録の128文字の文字集合と説明するのは、
この時代の仕様に基づく説明っぽいです。
[SEE[ [[公開テキスト指示シーケンス]] ]]


[20] 
実際にはこの規定に基づき [[ISO-IR]] に登録された[[終端バイト]]は1つもありません。


[REFS[
- [9] [CITE[[[ECMA-35]]_1st_edition_december_1971.pdf]], [TIME[2021-01-16T09:57:02.000Z]], [TIME[2022-05-01T05:17:03.679Z]] <https://www.ecma-international.org/wp-content/uploads/ECMA-35_1st_edition_december_1971.pdf#page=17>
]REFS]




* ISO/IEC 2022 の DOCS

[40] 
'''ISO/IEC 2022 の終端バイト''':
[[中間バイト]]なし、[[終端バイト]] [CODE(char)[04/00]]
(つまり [CODE(char)@en[[CODE(charname)@en[[[ESC]]]] 02/05 04/00]])
は [[ISO/IEC 2022]] の[[符号化システム]]を[[指示]]します。
他の[[符号化システム]]を使用中にこの[[エスケープ・シーケンス]]を使うと、
[[ISO/IEC 2022]] が[[指示]]され、前に [[ISO/IEC 2022]]
から他の[[符号化システム]]を[[呼出]]した時点の状態に復帰します。
前の状態とは、[[告知]]機能 ([CODE(charname)@en[[[ACS]]]]) 
により設定した状態と[[符号化図形文字集合]]と[[符号化制御機能集合]]の[[指示]]・[[呼出]]しの状態を指します。
[[現在位置]]などがどうなるかは [[ISO/IEC 2022]]
の範囲外とされています。
[SRC[[[JIS X 0202]]:1998 15.4.2]]

この[[エスケープ・シーケンス]]は [[ISO-IR]]
の登録の範囲外になっているようです。

[41] 
'''標準復帰''':
第2[[中間バイト]]が [CODE(char)[02/15]]
かどうかにより、 >>40 が使用できるか区別されます。

[CODE(char)[02/15]] でない [CODE(charname)@en[[[DOCS]]]]
で他の[[符号化システム]]を[[呼出]]すと、
[[ISO/IEC 2022]] に復帰するために >>40
を使用できます。

[CODE(char)[02/15]] な [CODE(charname)@en[[[DOCS]]]]
を使う他の[[符号化システム]]は、 [[ISO/IEC 2022]]
に復帰するために >>40 を使用しません。 
(別の方法で復帰できるかもしれませんし、できないかもしれません。)
復帰できたとしても [[ISO/IEC 2022]]
の状態 ([[告知]]、[[指示]]、[[呼出]]し) は不定とされています。

[SRC[[[JIS X 0202]]:1998 15.4.2]]

[42] 
[[ISO/IEC 2022]] [[符号化システム]]に復帰するためには >>40
を使うことが望ましいとされています。
[SRC[[[JIS X 0202]]:1998 15.4.1]]

[43] 
[[ISO/IEC 2022]] は復帰したときに [CODE(charname)@en[DOCS]] 
で移行したときの状態に戻るとしていますが、
他の符号化システム内で[[エスケープシーケンス]]やそれと同等の仕組みが利用可能なときに、
そこで変更した状態も復帰時に破棄して元の状態が復元されるべきなのかどうか、
よくわかりません。
[[ISO/IEC 2022]] が復帰時に復元すると明記しているのだからそれに戻るべきという解釈もあり得ますし、
[[ISO/IEC 10646におけるエスケープシーケンス]]のように [[ISO/IEC 2022のエスケープシーケンス]]を利用すると規定しているものは
[[ISO/IEC 2022]] の状態を参照・編集しているのだから復帰してもそれが破棄されるのはおかしいという解釈もあり得ます。
なぜか標準復帰あり・なしの2種類ある [[UTF-8]] がその違いを踏まえているという解釈もあり得ますが、
[[UTF-1]], [[UCS-2]], [[UTF-16]], [[UCS-4]] は各1種類しかないのがネックです。

[47] 
実際の所  (少なくても)
[[Unicode]] 系、
[[Videotex]]、
[[libmoe]]
と約半数の符号化系が
[[ISO/IEC 2022エスケープシーケンス]]を使っています。
それらは 
[[ISO/IEC 2022]] 
と (少なくても) 一部の状態を共有しているようです。 

[112] 
[[標準復帰]]は特定の[[ビット組合せ]]列が
[[ISO/IEC 2022]] 
の復帰に使われるというものですが、
その[[ビット組合せ]]が必ず[[標準復帰]]を意味しているわけではありません。
現に
[[Videotex]]
系の符号化環境は
[CODE(charname)@en[PCD]]
を使いますが、
そこでは指定したバイト長の任意のバイト列を含めることができます。
そのバイト列は
[[ISO/IEC 2022エスケープシーケンス]]として解釈されないので、
[[標準復帰]]を意味しません。
それゆえ、
[[標準復帰]]を使っているからといって、
構文の知識のない符号化系が指定されたとき、
その部分を読み飛ばすわけにはいかないのです。

[116] 
[[KS X 2502:2003]] ([[CGM]]) の p.66
には
[CODE(charname)@en[ESC]] [N[2/5]] [N[2/0]] [N[3/0]]
という例が示されています。
[[中間バイト]] [N[2/0]]
が使われていますが、
[[私用終端バイト]]の利用例として示されているだけで、
特に意味はなさげです。


* Unicode の DOCS

[31] [[UTF-1]], [[UTF-8]], [[UCS-2]], [[UTF-16]], [[UCS-4]] 
の[[終端バイト]]が登録されています。

[7] 
UCS 系符号化体系では ISO/IEC 2022 への復帰に ESC(U+001B) U+0025 U+0040
を使います。 [[UCS-2]], [[UTF-16]] では 0x001B 0x0025 0x0040 に、
[[UCS-4]] では 0x0000001B 0x00000025 0x00000040 になります。
[[UTF-8]] では 0x1B 0x24 0x40 になります。



[6] [[ISO/IEC 10646におけるエスケープシーケンス]]も参照。


[21] 
いくつかの実装が [[UTF-8]] に対応しています。 
[SRC[>>5, >>8, >>23]]
それを利用した[[Web頁]]もあります [SRC[>>22]]。



[8] [CITE[Man page of CONSOLE_CODES]], [TIME[2022-04-29T09:33:30.000Z]], [TIME[2022-04-30T10:06:40.770Z]] <https://linuxjm.osdn.jp/html/LDP_man-pages/man4/console_codes.4.html>

- ESC 2/5 G
- ESC 2/5 3/8 (旧式)

[SEE[ [[VT][VT100]] ]]

* Videotex の DOCS

[111] 
[[Videotex]] は [[ISO/IEC 2022]] ベースの符号と独自の符号の混在でした。
各種符号を 
[CODE[DOCS]] ([[標準復帰]]あり)
で切り替えられるとされていました (少なくても仕様書の上では)。

- [46] ESC 02/05 04/01 : [[ISO-IR]] 108 : [[NAPLPS]] ([[T.101]] Data Syntax III)
- [48] ESC 02/05 04/03 : [[ISO-IR]] 131 : Data Syntax I of CCITT Rec. T.101.
- [49] ESC 02/05 04/04 : [[ISO-IR]] 145 : Data Syntax II of CCITT Rec. T.101.
- [50] ESC 02/05 04/05 : [[ISO-IR]] 160 : 
Photo-Videotex Data Syntax of CCITT Recommendation T.101.
- [51] ESC 02/05 04/06 : [[ISO-IR]] 161 :
Audio Data Syntax of CCITT Recommendation T.101.
- [52] ESC 02/05 04/08 : [[ISO-IR]] 186 :
VEMMI Data Syntax of (draft) ITU-T Recommendation

[53] [[私用終端バイト]]も使われていました。 [SEE[ [[VT][VT100]] ]]

- [54] [CODE(charname)@en[ESC]] [N[2/5]] [N[3/0]] - 
[CODE(charname)@en[DECTCS]] (Exit NAPLPS)
- [55] [CODE(charname)@en[ESC]] [N[2/5]] [N[3/4]] -
[CODE(charname)@en[DECSCCS]] (Enter NAPLPS)

[113] 
他に [[T.100]] が
[CODE(charname)@en[ESC]] [N[2/5]] 5/[VAR[h]] 
と規定していました。
該当する[[終端バイト]]は登録されておらず、
仕様策定が頓挫したものと思われます。
これは実質的には
alphageometric coding scheme
という[[96集合]] ([[図形文字集合]]ではない)
の[[指示]]として機能するものでした。
[[標準復帰]]すら待たずに [[G1]] への[[指示]]で終了します。

;; [115] [[標準復帰]]のない旧 [[ISO 2022]] 時代に規定されたのでしょう。

[114] 
他にも [[NAPLPS]] で独自の[[エスケープシーケンス]]が用いられたとする説があります。
[SEE[ [[NAPLPS]] ]]

* VTS の DOCS

[4] [[ISO-IR]] 125 
[CODE(charname)@en[ESC]] [N[02/05]] [N[02/15]] [N[04/02]]
Virtual Terminal Service Transparent Set は、
8ビットの1バイト符号化文字集合で、 ISO [[OSI]] 仮想端末規格で利用します。
仮想端末サービス (VTS) の利用者が VTS の適用範囲外たる意味を
一部又は全部の値に割り当てます。 VTS はその意味や解釈の責任を有しません。
ISO/IEC 2022 符号化体系に復帰する手段はありません。
(ISO 9040, ISO 9041)

* 印刷プロトコルの DOCS

[58] 
[CODE(charname)@en[ESC]] [N[2/5]] [N[3/13]] :
IBM Proprinter Emulation mode
[SRC[>>15]]

[60] 
[[DEC PPL]] で使われます。[[標準復帰]]とほか2種類以外の 
[[DEC PPL]] [[エスケープシーケンス]]は認識しなくなります。
(利用可能な [[CSI]] も [[CR]] でなく [[ESC Fe]] でなければなりません。)
[SRC[>>15]]

[61] 
[CODE(charname)@en[ESC]] [N[2/5]] [N[3/13]] [SRC[>>15]]
と[[標準復帰]] [CODE(charname)@en[ESC]] [N[2/5]] [N[4/0]] [SRC[>>14]]
は、 [[DEC PPL]] のプロトコルとしての挙動変化という
([[符号化システム]]としてみたときの) 副作用を持ちます。

[REFS[
- [13] [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=108>
-- [14] <http://sup.xenya.si/sup/info/digital/MDS/jun99/Cd3/PRINTER/PPLV2PMB.PDF#page=160>
-- [15]  <http://sup.xenya.si/sup/info/digital/MDS/jun99/Cd3/PRINTER/PPLV2PMB.PDF#page=170>
]REFS]

-*-*-

[62] 
[[DEC PPL]] において
[CODE(charname)@en[ESC]] 2/5 2/0 3/0 は bar code の始まり、
[[標準復帰]] [CODE(charname)@en[ESC]] 2/5 4/0 は終わりを表します。
[SRC[>>13]]

[63] 
[[バーコード]] (と付随する文字列) の記述方法は[[制御シーケンス]]で指定できます。
[SRC[>>13]]

* VT の DOCS

[57] [SEE[ [[VT][VT100]] ]]

- [121] [CODE(charname)@en[ESC]] 2/5 3/0 - [CODE(charname)@en[DECTCS]] (Exit NAPLPS)
- [122] [CODE(charname)@en[ESC]] 2/5 3/4 - [CODE(charname)@en[DECSCCS]] (Enter NAPLPS)
- [56] [CODE(charname)@en[ESC]] [N[2/5]] [N[3/8]] -
[CODE(charname)@en[DECHPPCL]] (Enter HP PCL emulation mode)

[123] >>8

- ESC 2/5 3/8 [[UTF-8]]

[124] 
[CITE@ja[Control functions - akinomyoga/contra]], [TIME[2021-12-31T23:05:20.000Z]], [TIME[2022-12-12T10:07:54.116Z]] <https://akinomyoga.github.io/contra/escseq.html#dfn.DOCS>

- ESC % ! 0	_TEKSCTEK
- ESC % ! 1	_TEKSCANS
- ESC % ! 2	_TEKSCEDT
- ESC % ! 3	_TEKSCV52


* ctext の DOCS

[64] 
[[X]] の [[Compound Text]] では 
[DFN[extended segment]]
に
[CODE(charname)@en[DOCS]] が使われます。
他で表せない[[文字]]に使います。
[SRC[>>3]]

[67] 構文: [SRC[>>3]]

- [65] [CODE(charname)@en[ESC]] [N[2/5]] [N[2/15]] [VAR[F]] [VAR[M]] [VAR[L]] [VAR[bytes]]

[66] [VAR[F]] は次のいずれかです。 [SRC[>>3]]

- [N[3/0]] 可変長バイト
- [N[3/1]] 1バイト文字
- [N[3/2]] 2バイト文字
- [N[3/3]] 3バイト文字
- [N[3/4]] 4バイト文字
- [ [N[3/5]], [N[3/15]] ] 将来の拡張用

[68] [VAR[M]] と [VAR[L]] は長さを表す各1バイト (最上位ビット [N[1]]) です。
(([VAR[M]] - 128) × 128) + ([VAR[L]] - 128)
で [VAR[bytes]] の長さを表します。
[SRC[>>3]]

[69] 
[VAR[F]] が [ [N[3/0]], [N[3/4]] ] のとき、
[VAR[bytes]]
は

- [VAR[encoding name]] [N[0/2]] [VAR[text]]

... という構造になります。 [VAR[encoding name]] が[[文字符号化]]の名前、
[VAR[text]] がそれによって[[符号化]]された[[バイト列]]です。
[SRC[>>3]]


[71] 
復帰は明示せず、指定された長さで自動的に [[ISO/IEC 2022]] に戻るようです。

[72] 
[[ctext]] は仕様全体が[[ドラコニアンエラー処理]]を採用しており [SRC[>>3]]、
[CODE(chraname)@en[DOCS]] やそれ以後が指定された構文に合わない時の処理は規定されていません。

[REFS[
-
[3] [CITE[Compound Text Encoding]], [TIME[2010-12-20T07:36:19.000Z]], [TIME[2022-04-30T07:37:11.422Z]] <https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/CTEXT/ctext.html#Non_Standard_Character_Set_Encodings>
]REFS]
-*-*-

[70] 
[VAR[encoding name]] は[[ISO 8859-1]] で記述します。
[SRC[>>3]]

[101] [VAR[encoding name]] は登録簿のものであるべきです。
[SRC[>>3]]
次のものが登録されています。 [SRC[>>83]]

,* [VAR[encoding name]] ,* 登録簿の説明 ,* メモ
, [CODE[DEC.CNS11643.1986-2]],CNS11643 2-plane using the recommended internal representation scheme, [[DEC Hanyu]] CNS 第2面
, [CODE[DEC.DTSCS.1990-2]],DEC Taiwan Supplemental Character Set, [[DTSCS]]
, [CODE[fujitsu.u90x03]], , [[U90]] [[CS3]]
,[CODE[ILA]],registry prefix,
,[CODE[IPSYS]],registry prefix,
,[CODE[omron_UDC]],omron User Defined Charset,[SEE[ [[omron_UDC]] ]]
,[CODE[omron_UDC_ja]],omron User Defined Charset for Japanese,[SEE[ [[omron_UDC]] ]]
,[CODE[omron_UDC_zh]],omron User Defined Charset for Chinese(Main land),[SEE[ [[omron_UDC]] ]]
,[CODE[omron_UDC_tw]],omron User Defined Charset for Chinese(Taiwan),[SEE[ [[omron_UDC]] ]]

[75] 「registry prefix」は [CODE[DEC.]] のように名前の接頭辞に使うもののようです。
2つ登録されていますが、それを接頭辞とする実際の値があるのかは不明です。

[102] 
現在[[オープンソース]]で公開されている [[X]] の実装中で発見できるのはこのうち
[CODE[fujitsu.u90x03]]
だけです。それ以外は非公開の商用製品などで使われていたのでしょうか。

[103] 
現在[[オープンソース]]で公開されている [[X]] の実装中には次のものがあります。

[FIG(table)[

:n: [VAR[encoding name]]
:f: バイト長
:size: 集合大
:side: 左右
:note: メモ

:n: [CODE[iso8859-14]]
:f: [N[1]]
:side: 右
:note: [[後方互換性]]のため

:n: [CODE[iso8859-15]]
:f: [N[1]]
:side: 右
:note: [[後方互換性]]のため

:n: [CODE[big5-0]]
:f: [N[2]]
:side: 両

:n: [CODE[big5hkscs-0]]
:f: [N[2]]
:side: 両

:n: [CODE[gbk-0]]
:f: [N[2]]
:side: 両

:n: [CODE[armscii-8]]
:side: 右
:f: [N[1]]

:n: [CODE[georgian-academy]]
:side: 右
:f: [N[1]]

:n: [CODE[georgian-ps]]
:side: 右
:f: [N[1]]

:n: [CODE[ibm-cp1133]]
:side: 右
:f: [N[1]]

:n: [CODE[iscii-dev]]
:side: 右
:f: [N[1]]

:n: [CODE[isiri-3342]]
:side: 右
:f: [N[1]]

:n: [CODE[iso8859-9e]]
:side: 右
:f: [N[1]]

:n: [CODE[fujitsu.u90x03]]
:side: 左/右
:size: [N[94]]
:f: [N[2]]

:n: [CODE[koi8-c]]
:side: 右
:f: [N[1]]

:n: [CODE[koi8-r]]
:side: 右
:f: [N[1]]

:n: [CODE[koi8-u]]
:side: 右
:f: [N[1]]

:n: [CODE[microsoft-cp1251]]
:side: 右
:f: [N[1]]

:n: [CODE[microsoft-cp1255]]
:side: 右
:f: [N[1]]

:n: [CODE[microsoft-cp1256]]
:side: 右
:f: [N[1]]

:n: [CODE[mulelao-1]]
:side: 右
:f: [N[1]]

:n: [CODE[nokhchi-1]]
:side: 右
:f: [N[1]]

:n: [CODE[tatar-cyr]]
:side: 右
:f: [N[1]]

:n: [CODE[tscii-0]]
:side: 右
:f: [N[1]]

:n: [CODE[tcvn-5712]]
:side: 右
:f: [N[1]]

:n: [CODE[viscii1.1-1]]
:side: 右
:f: [N[1]]

]FIG]

[104] 現在[[オープンソース]]で公開されている 
[[X]] の実装では[[ソースコード]]中にハードコードされているものと、
[[ロケール]]を定義するテキストファイルから読み込んで定められるものがあります。
[[X]] を利用する製品や実際の運用によっては、
後者の仕組みを通じてこれら以外を使ったり、
これらの定義を修正したりすることもあるのかもしれません。

[105] 現在[[オープンソース]]で公開されている 
[[X]] の実装では [VAR[encoding name]] は定義の読み込み時点で
[[ASCII小文字]]に変換したものが利用されます。
[[ctext]] の仕様には[[大文字]]と[[小文字]]の違いに言及がなく、
登録簿 (>>101) には[[大文字]]混じりのものも含まれるのですが、
[[X]] の実装によっては[[大文字]]も使えるのかもしれません。


[106] 
[VAR[encoding name]]
として
[[HP-UX]] で [CODE[HP-BIG5]] (バイト長可変)、
[[Digital UNIX]] [CODE[BIG5-0]] (バイト長2)
が使われました。
[SRC[>>100]]
後者は >>103 にもありますが、こちらでは[[大文字]]です。

[109] 
過去にはここに挙げた以外にも実装例のある [VAR[encoding name]] が存在したかもしれません。

[110] 
[[Compound Text]] 仕様書にはバイト長4まで定められていますが、
3バイト、4バイトの [VAR[encoding name]] は確認されていません。

[107] 
なお、 >>83, >>99
は
[[94[SUP[2]]集合]]の [[GL]] を [CODE(charname)@en[ESC]] [N[2/5]] [N[2/8]] [N[3/2]],
[[GR]] を [CODE(charname)@en[ESC]] [N[2/5]] [N[2/15]] [N[3/2]]
と書いて区別しています。
前者は何らかの誤りなのか、あるいは過去にそう実装していたものがあったのか不明です。


[REFS[
- [73] 
[CITE@en[registry - xorg/doc/xorg-docs - X.org xorg-docs documentation. (mirrored from https://gitlab.freedesktop.org/xorg/doc/xorg-docs)]], [TIME[2022-05-05T05:03:11.000Z]], [TIME[2022-05-05T05:23:49.553Z]] <https://cgit.freedesktop.org/xorg/doc/xorg-docs/tree/registry#n961>
- [97] [CITE@en[lcCT.c\xlibi18n\src - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-05T12:41:42.000Z]], [TIME[2022-05-06T02:57:34.008Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/src/xlibi18n/lcCT.c>
-- [98] 
[PRE[
    /* Registered encodings with a varying number of bytes per character */
    { "ISO10646-1",         /* UTF-8               196   */ "\033%G"  },

    /* Encodings without ISO-IR assigned escape sequence must be
       defined in XLC_LOCALE files, using "\033%/1" or "\033%/2". */

    /* Backward compatibility with XFree86 3.x */
#if 1
    { "ISO8859-14:GR",                                      "\033%/1" },
    { "ISO8859-15:GR",                                      "\033%/1" },
#endif
    /* For use by utf8 -> ctext */
    { "BIG5-0:GLGR", "\033%/2"},
    { "BIG5HKSCS-0:GLGR", "\033%/2"},
    { "GBK-0:GLGR", "\033%/2"},
    /* used by Emacs, but not backed by ISO-IR */
    { "BIG5-E0:GL", "\033$(0" },
    { "BIG5-E0:GR", "\033$)0" },
    { "BIG5-E1:GL", "\033$(1" },
    { "BIG5-E1:GR", "\033$)1" },

};

/* We represent UTF-8 as an XlcGLGR charset, not in extended segments. */
#define UTF8_IN_EXTSEQ 0
]PRE]
- [74] [CITE@en[lcGeneric.c\xlibi18n\src - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T03:54:07.000Z]], [TIME[2022-05-06T04:00:43.699Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/src/xlibi18n/lcGeneric.c>
- [96] [CITE@en[lcCharSet.c\xlibi18n\src - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-05T13:02:57.000Z]], [TIME[2022-05-06T02:55:03.540Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/src/xlibi18n/lcCharSet.c>
- [76] [CITE@en[XLC_LOCALE.pre\armscii-8\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-05T12:12:38.000Z]], [TIME[2022-05-05T12:13:01.088Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/armscii-8/XLC_LOCALE.pre>
--
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	ARMSCII-8
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [77] [CITE@en[XLC_LOCALE.pre\georgian-academy\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-05T12:17:08.000Z]], [TIME[2022-05-05T12:17:16.682Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/georgian-academy/XLC_LOCALE.pre>
--
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	GEORGIAN-ACADEMY
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [78] [CITE@en[XLC_LOCALE.pre\georgian-ps\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-05T12:18:04.000Z]], [TIME[2022-05-05T12:18:08.013Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/georgian-ps/XLC_LOCALE.pre>
--
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	GEORGIAN-PS
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [79] [CITE@en[XLC_LOCALE.pre\ibm-cp1133\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T01:41:11.000Z]], [TIME[2022-05-06T02:27:58.537Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/ibm-cp1133/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	IBM-CP1133
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [80] [CITE@en[XLC_LOCALE.pre\iscii-dev\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:28:38.000Z]], [TIME[2022-05-06T02:30:04.928Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/iscii-dev/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	ISCII-DEV
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [81] [CITE@en[XLC_LOCALE.pre\isiri-3342\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:30:23.000Z]], [TIME[2022-05-06T02:30:25.360Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/isiri-3342/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	ISIRI-3342
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [82] [CITE@en[XLC_LOCALE.pre\iso8859-9e\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:38:53.000Z]], [TIME[2022-05-06T02:38:57.304Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/iso8859-9e/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	ISO8859-9E
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [83] [CITE@en[XLC_LOCALE.pre\ja.SJIS\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:40:30.000Z]], [TIME[2022-05-06T02:41:05.607Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/ja.SJIS/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0    {
        charset_name    u90x03.1991-0
        side            GL
        length          2
        gc_number       94
        string_encoding False
        sequence        \x1b\x25\x28\x32
        encoding_name   fujitsu.U90X03
}

csd1    {
        charset_name    u90x03.1991-0
        side            GR
        length          2
        gc_number       94
        string_encoding False
        sequence        \x1b\x25\x2f\x32
        encoding_name   fujitsu.U90X03
}
END XLC_CHARSET_DEFINE
]PRE]
- [99] [CITE['''['''PATCH libX11 4/5''']''' i18n: Remove ja.S90 and ja.U90 locales.]], [TIME[2012-12-21T13:28:17.000Z]], [TIME[2022-05-06T03:28:44.007Z]] <https://lists.x.org/archives/xorg-devel/2012-December/034661.html>
- [84] [CITE@en[XLC_LOCALE.pre\koi8-c\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:44:28.000Z]], [TIME[2022-05-06T02:44:35.448Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/koi8-c/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	KOI8-C
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [85] [CITE@en[XLC_LOCALE.pre\koi8-r\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:45:05.000Z]], [TIME[2022-05-06T02:45:08.302Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/koi8-r/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	KOI8-R
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [86] [CITE@en[XLC_LOCALE.pre\koi8-u\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:45:40.000Z]], [TIME[2022-05-06T02:45:42.498Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/koi8-u/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	KOI8-U
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [87] [CITE@en[XLC_LOCALE.pre\microsoft-cp1251\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:46:09.000Z]], [TIME[2022-05-06T02:46:12.627Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/microsoft-cp1251/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	MICROSOFT-CP1251
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [88] [CITE@en[XLC_LOCALE.pre\microsoft-cp1255\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:46:39.000Z]], [TIME[2022-05-06T02:46:41.113Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/microsoft-cp1255/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	MICROSOFT-CP1255
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [89] [CITE@en[XLC_LOCALE.pre\microsoft-cp1256\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:47:11.000Z]], [TIME[2022-05-06T02:47:14.705Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/microsoft-cp1256/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	MICROSOFT-CP1256
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [90] [CITE@en[XLC_LOCALE.pre\mulelao-1\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:47:53.000Z]], [TIME[2022-05-06T02:47:55.792Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/mulelao-1/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	MULELAO-1
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [91] [CITE@en[XLC_LOCALE.pre\nokhchi-1\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:48:29.000Z]], [TIME[2022-05-06T02:48:30.769Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/nokhchi-1/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	NOKHCHI-1
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [92] [CITE@en[XLC_LOCALE.pre\tatar-cyr\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:49:42.000Z]], [TIME[2022-05-06T02:49:45.966Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/tatar-cyr/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	TATAR-CYR
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [93] [CITE@en[XLC_LOCALE.pre\tscii-0\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:50:45.000Z]], [TIME[2022-05-06T02:50:48.184Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/tscii-0/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	TSCII-0
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [94] [CITE@en[XLC_LOCALE.pre\vi_VN.tcvn\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:51:19.000Z]], [TIME[2022-05-06T02:51:22.759Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/vi_VN.tcvn/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	TCVN-5712
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [95] [CITE@en[XLC_LOCALE.pre\vi_VN.viscii\nls - xorg/lib/libX11 - libX11 GIT Repository (mirrored from https://gitlab.freedesktop.org/xorg/lib/libx11)]], [TIME[2022-05-06T02:51:50.000Z]], [TIME[2022-05-06T02:51:53.022Z]] <https://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/vi_VN.viscii/XLC_LOCALE.pre>
[PRE[
XLC_CHARSET_DEFINE
csd0	{
	charset_name	VISCII1.1-1
	side		GR
	length		1
	string_encoding	False
	sequence	\x1b%/1
}
END XLC_CHARSET_DEFINE
]PRE]
- [100] 
[CITE[OpenText Exceed User's Guide - Exceed.pdf]], [TIME[2015-03-12T18:13:29.000Z]], [TIME[2022-05-06T03:31:05.514Z]] <https://mimage.opentext.com/evals/connv15/docs/Exceed.pdf#page=130>
[FIG(quote)[

>Because there is no standard encoding in Traditional Chinese
environments, Exceed can support only one encoding name at a time. By
default, Exceed supports the HP-BIG5 (HP Traditional Chinese
Environment) encoding. If you want to use the BIG5-0 (Digital Traditional
Chinese Environment) encoding, you need to make changes to the Exceed
initialization file and the [CODE[xlc_locale]] file.
>[SNIP[]]
>• # used for HP-UX
>• # ct_encoding
HP-BIG5:GLGR:\x1b\x25\x2f\x30\x80\x8aHP-BIG5\x02
>• # used for Digital UNIX
>• ct_encoding 
BIG5-0:GLGR:\x1b\x25\x2f\x32\x80\89BIG5-0\x02

]FIG]

]REFS]

* libmoe の DOCS

[26] 
[[文字コード]]変換ライブラリー [[libmoe]] は [[ISO/IEC 2022]] 
と他のいくつかの[[文字コード]]体系に対応しており、
[CODE(charname)@en[DOCS]] の独自構文 ([[私用終端バイト]])
で相互に切り替えられます。
[SRC[>>5]]

;; [29] [CODE[mbconv]] という変換プログラムが付属する他、
[[w3m]] を機能拡張した [[w3mmee]] という [[Webブラウザー]]でも利用されています。

;; [30] 更新が停止して久しいですが、公式サイトのソースコードの他、
現在でも [[Ubuntu]] のパッケージが提供されていてすぐに利用できます。
[TIME[2022-05-05T03:13:35.400Z]]

[27] 
[[ISO/IEC 2022]], [[UTF-8]], [[UTF-16]]
以外は独自の構文:

[CODE(charname)@en[ESC]] [N[2/5]] [N[2/1]] [VAR[I]] [VAR[Fp]]

... を使います。 [SRC[>>5]]


[24] [SRC[>>5]]

- [N[2/0]] [N[3/0]] : [CODE[x-moe-internal]]
- [N[2/0]] [N[3/1]] : [[KOI8-R]]
- [N[2/0]] [N[3/2]] : [[KOI8-U]]
- [N[2/0]] [N[3/3]] : [[Windows-1250]]
- [N[2/0]] [N[3/4]] : [[Windows-1251]]
- [N[2/0]] [N[3/5]] : [[Windows-1252]]
- [N[2/0]] [N[3/6]] : [[Windows-1253]]
- [N[2/0]] [N[3/7]] : [[Windows-1254]]
- [N[2/0]] [N[3/8]] : [[Windows-1255]]
- [N[2/0]] [N[3/9]] : [[Windows-1256]]
- [N[2/0]] [N[3/10]] : [[Windows-1257]]
- [N[2/0]] [N[3/11]] : [[Windows-1258]]
- [N[2/0]] [N[3/12]] : [[シフトJIS]] ([[左側]]は [[ASCII]], [N[0xF0]] - [N[0xFF]] は不存在)
- [N[2/0]] [N[3/13]] : [[Shift_JISX0213]] ([[左側]]は [[ASCII]])
- [N[2/0]] [N[3/14]] : [[Big5]]
- [N[2/0]] [N[3/15]] : [[Johab]]
- [N[2/1]] [N[3/0]] : [[UHC]]
- [N[2/1]] [N[3/1]] : [[EUC-TW]]
- [N[2/1]] [N[3/2]] : [[x-euc-jisx0213-packed]] ([[EUC-JISX0213]] + [[JIS X 0212]])
- [N[2/1]] [N[3/3]] : [[GBK]]
- [N[2/1]] [N[3/4]] : [[GB 18030]]
- [N[2/1]] [N[3/5]] [[以上]] : [N[2/0]] [N[3/0]] と同等

[28] 
[[エスケープシーケンス]]は [[ISO/IEC 2022]] 以外でも利用できます。
[CODE(charname)@en[DOCS]] を超えて状態が持続します。
[[左側]]は [[ISO/IEC 2022]] 以外でも[[指示シーケンス]]や[[固定シフト]]が解釈されます。
[[右側]]は不可解でよくわかりません。


[25] 出力の符号化 ([[ISO/IEC 2022]] 系のもの以外を含む。) で表現できないとき、
[CODE(charname)@en[ESC]] [N[2/5]] [N[2/1]] [N[2/0]] [N[3/0]]
が使われます。適宜 [CODE(charname)@en[ESC]] [N[2/5]] [N[4/0]]
が入ることもあれば、入らないまま [[ISO/IEC 2022]]
[[指示シーケンス]]が現れることもあります (この辺は若干挙動が怪しい)。

[108] 
なお、このうち [CODE[EUC-TW]] と [CODE[x-euc-jisx0213-packed]]
は [[ISO/IEC 2022]] の符号構造から逸脱していないので、
本来 [CODE(charname)@en[DOCS]] にしなければならない理由はありません。
ここで [CODE(charname)@en[DOCS]] が用いられたのは、
これらが正規の[[終端バイト]]を用いた[[指示シーケンス]]で記述できない[[符号化文字集合]]を使っているからでしょう。


[REFS[
-[5] [CITE[Kiyokazu in (hopefully) hacker mode (multi octet character encoding handling library)]], [TIME[2020-10-25T00:25:49.000Z]] <http://pub.ks-and-ks.ne.jp/prog/libmoe/>
-- [23] [CITE@ja[多符号化対応w3m]], [TIME[2022-05-04T09:47:33.000Z]] <http://pub.ks-and-ks.ne.jp/prog/w3mmee/>
-- [22] [CITE[Mapping of Unicode into ISO 2022]], [TIME[2022-05-04T09:45:48.000Z]] <http://pub.ks-and-ks.ne.jp/prog/unicode-vs-iso2022/>

]REFS]

* ecma35lib の [CODE(charname)@en[DOCS]]

[119] [CITE[[[ecma35lib]]]] は次の [CODE(charname)@en[DOCS]] 
[[Fp]] に対応しているようです。
[SRC[>>118]]

- [N[3/0]] - [[Shift_JIS]]
- [N[3/1]] - [[UHC]] / [[KPS][2011KPS]]
- [N[3/2]] - [[GBK]] / [[GB 18030]]
- [N[3/3]] - 「"Plain extended ASCII", i.e. without 0x80-0x9F as a control character range」
- [N[3/4]] - [[Big5]] (lead byte range 0x81-0xFE)
- [N[3/5]] - [[Big5]] (lead byte range 0xA1-0xFC)
- [N[3/6]] - [[HangulTalk]]
- [N[2/15]] [N[3/0]] - [[SCSU]]

[120] 
ここで
"Plain extended ASCII"
は
[[ISO/IEC 2022]] [[エスケープシーケンス]]による[[文字集合]]の切り替えの他に、
[CODE(charname)@en[DECSPPCS]] (の独自の拡張) と
[[CSI )p]]
による[[文字集合]]の切り替えが使えます。
それによって各[[コードページ]]に切り替えられます。
[SRC[>>118]]


[REFS[
- [118] [CITE@en[GitHub - harjitmoe/[[ecma35lib]]: Aspiring to implement ECMA-35, in its fullness, for a Unicode era. This repo may occasionally lag behind the one on Gitlab.]], [TIME[2022-10-27T04:30:03.000Z]] <https://github.com/harjitmoe/ecma35lib#separate-coding-systems>
]REFS]

* 文脈

[1] [[SGML]] の[[公式公開識別子]]の[[公開文指示シーケンス]]における [CODE(char)[DOCS]] の用法についての話は [CODE(WikiPage)[[[CHARSET]]]] を参照。

[59] 
[[ISO/IEC 2022 character transfer syntax]] では使えません。
[SRC[[[ISO/IEC 2022]] A.3.2]]

* 処理

[SEE[ [[ISO/IEC 2022 decoder]] ]]

* 関連

[38] 
[[ISO/IEC 2022]] を使用する場面によっては、
使用する[[符号化システム]]を指定する方法が別途用意されているかもしれません。
また、 [[ISO/IEC 2022]] にも [[ISO/IEC 2022]]
[[符号化データ要素]]列の終わりを示す
[CODE(charname)@en[[[CMD]]]] という[[制御機能]]があります。
このようなものを使用して [[ISO/IEC 2022]]
とそれ以外を区別できる環境では、それを使って構いません。
特別そのような方法が用意されていない場合は、
[CODE(charname)@en[[[DOCS]]]] を使って[[符号化システム]]を切換えることにしても構いません。

* メモ








