ISO 2022

ISO 2022とは文字コードの切り替え方法を規定したもので文字コード体系のことではなく、複数の文字コード系を必要に応じて切り替えるための枠組みを規定したものです。コード表を切り替えるという考え方によって複数のコード表を1つのファイルの中に混在させることができるわけです。例えば先に挙げた7ビット構成のJIS X 0201ではローマ字とカタカナ文字のコード表をSI/SOという制御コードによって切り替えましたが基本的な考え方はそれと同じです。

ISO 2022では図のようなインユーステーブル(現在使用中の文字コードがロードされている表)を持ちます。(7ビット構成の場合はGR領域はありません。)(補足1)

ISO 2022 インユーステーブル

指示と呼び出し

このGLもしくはGRの領域に切り替えたい文字コード表をロードするわけですが、この手順は、

  1. 中間バッファへ文字コード表のロードを指示(designate)する
  2. 中間バッファをGL(もしくはGR)に呼び出す(invoke)

という指示・呼び出しの2ステップとなります。

中間バッファは4つあり、それぞれG0〜G3と呼ばれます。中間バッファへのロードはエスケープシーケンスを使って指示します。エスケープシーケンスとはESC(0x1b)(補足2)で始まる一連の文字列のことです。多くの文字コードを切り替えて使用するということが目的ですから、このエスケープシーケンスが重複してしまっては切り替えができませんのでISOの機関で管理されています。

一方、呼び出し(invoke)にはシフトコードを使用します。呼び出し方には

の2種類があり、ロッキングシフトとは次の呼び出しがあるまではずっとGL(もしくはGR)の内容がシフトされたままの状態、シングルシフトはGR(もしくはGR)が1文字分だけシフトされ、その後はシフト前の状態に戻ることを言います。この2種類のシフトと対象となる中間バッファ(G0〜G3)の組み合わせが呼び出しのシフトコードということになりますのでかなり複雑で以下の表のようになります。

7ビット構成の場合
略号ASCII表現意味
SOSOG0のロッキングシフト
SISIG1のロッキングシフト
LS2ESC nG2のロッキングシフト
LS3ESC oG3のロッキングシフト
SS2ESC SS2G2のシングルシフト
SS3ESC SS3G3のシングルシフト
8ビット構成の場合
略号ASCII表現意味
LSOSIG0のGLへのロッキングシフト
LS1SOG1のGLへのロッキングシフト
LS2ESC nG2のGLへのロッキングシフト
LS3ESC oG3のGLへのロッキングシフト
LS1RESC ~G1のGRへのロッキングシフト
LS2RECS }G2のGRへのロッキングシフト
LS3RESC |G3のGRへのロッキングシフト
SS2SS2G2のシングルシフト
SS3SS3G3のシングルシフト

ここで、7ビット系の構成でG2/G3のシングルシフト制御コードのSS2/SS2はそれぞれ0x8e、0x8fとなり7ビット構成の場合範囲外となってしまいます。このようにいわゆるC1制御コード領域(0x80〜0x9f)を7ビット構成のISO 2022で使用する場合ESC付加することでその使用を可能とします。8ビット構成の場合は範囲内ですのでESCは不要となります。

(補足1)

図ではGL/GRの最初と最後のマスが欠けていますが、「指示と呼び出し」に書いたように、このGL/GRの領域にはG0〜G3までのいづれかのバッファがロードされますので0x20、0x7fおよび0xa0、0xff部分も指示を受けたバッファの内容で置き換わります。ただし、G0バッファには0x20、0x1fに当たるマスに文字コードを割り当てることができません。こういう細かい規則がISO 2022を非常に複雑なものにしています。

(補足2)

便宜上、エスケープコードをASCII表現(ESC=0x1b)と記述していますが、ISOの規格書では01/11(マトリクスの01列11行目)という記述になっています。これはISO 2022には制御コード自体をも切り替える仕様が存在し、必ずしもESC(01列11行目)が0x1bのコードになるとは限らないためです。ただ、当コンテンツでは、日本語に関するISO 2022系のエンコーディングスキーム(JIS X 0201/ISO-2022-JP/EUC-JP)ではこの位置(01列11行目)に必ずASCIIコード(0x1b)が入りますのでこのように記述しています。