ISO/IEC 2022
ISO/IEC 2022 Informační technologie - Struktura znakového kódu a techniky rozšíření, je ISO standard definující
 techniku pro zahrnutí několika znakových sad do jednoho systému kódování znaků, včetně reprezentace rozsáhlých znakových sad a
 techniku pro reprezentaci těchto kódování v 8 i 7bitových systémech pomocí stejného kódování.

Verze ISO/IEC 2022 z roku 1994 je identická s 6. vydáním ECMA standardu ECMA-35, které je volně dostupné a s japonskou normou JIS X 0202 z roku 1998.

Část znakových sad zahrnutých do ISO/IEC 2022 jsou dvoubytová kódování, u nichž je jeden znak kódován dvěma byty. Kvůli tomu je ISO-2022 kódování s proměnnou délkou znaku. Konkrétní implementace nemusí implementovat celý standard; úroveň shody a podporované znakové sady jsou definované implementací.

Úvod 
Pro zápis jednotlivých jazyků, které používají hláskovou abecedu, ať se jedná o latinku nebo jinou abecedu, jako v případě řečtiny, ruštiny, arabštiny nebo hebrejštiny, obvykle stačí 8bitové kódování, které zpravidla rozšiřuje kódování ASCII. Východoasijské jazyky, konkrétně čínština, japonština a korejština, používají mnohem více znaků, než kolik lze reprezentovat v 8bitovém bytu, byly nejdříve reprezentovány na počítačích dvoubytovými kódováními pro konkrétní jazyk. ISO/IEC 2022 umožňuje současně reprezentovat znaky z různých znakových sad včetně východoasijských jazyků pomocí jednoho znakového kódu.

Při reprezentaci rozsáhlých znakových sad vychází ISO/IEC 2022 z definic ISO/IEC 646, které rozdělují prostor sedmibitového kódu na 32 řídicích znaků, znak mezera, 94 tisknutelných znaků a řídicí znak delete. Pokud vynecháme kódy řídicích znaků a mezery, lze při použití dvou bytů reprezentovat až 8836 (94×94) znaků; pomocí tří bytů až 830584 (94×94×94) znaků (standard sice definuje, jak používat tříbytové sady, ale žádná z dosud registrovaných znakových sad tříbytové kódování nepoužívá). U dvoubytových znakových sad se kódový bod každého znaku zadává ve formě zvané kuten (japonsky: ), případně (zvláště když pracujeme s kódováním GB2312 a příbuznými standardy) quwei (čínsky: ), která určuje řádek neboli zónu (, japonsky: ku, čínsky: qu) a bod (japonsky:  ten) nebo pozici (čínsky:  wei) konkrétního znaku v zóně.

ISO/IEC 2022 definuje escape sekvence, které nastavují znakovou sadu použitou pro následující znaky. Escape sekvence nejen deklarují, jaká znaková sada se má použít, ale díky znalosti vlastností znakové sady i určují, zda kódování používá 94, 96, 8836 nebo 830584 (případně jiný počet) znaků.

Přepínání znakových sad vyžaduje, aby data byla zpracovávána sekvenčně v dopředném směru, protože jejich správná interpretace závisí na escape sekvenci, která jim předchází. Odvozené standardy (například ISO-2022-JP) mohou vynucovat konkrétní podmínky, například aby aktuální znaková sada byla před koncem řádku nastavena na US-ASCII.

V praxi se escape sekvence nemusí použít, jestliže je z kontextu nebo konvence zřejmé, jaká konkrétní znaková sada se myslí. Například RFC 1922 definující ISO-2022-CN umožňuje používat ISO-2022 SHIFT znaky bez explicitního používání escape sekvencí. Také v ISO/IEC 8859 je uvedeno, že není třeba používat žádné escape sekvence. Znakové sady ISO-8859-X tak jsou konkrétními pevnými kombinacemi komponent podle ISO-2022: typicky kombinace standardní sady řídicích znaků C0, znakové sady US-ASCII (v GL) a standardní sady řídicích znaků C1 s kódy (GR) definovanými pro jednotlivé varianty ISO-8859-X; například ISO-8859-1 lze definovat kombinací ISO-IR-1, ISO-IR-6, ISO-IR-77 a ISO-IR-100 bez shiftů nebo znakových změn.

Znakové sady ISO/IEC 2022, které používající řídicí posloupnosti (především ISO-2022-JP), se stále používají, ale většina moderních aplikací pro e-mail obsahuje jen jednodušší transformace pro Unicode, jako například UTF-8. Kódování, která nepoužívají řídicí posloupnosti (například sady ISO/IEC 8859) se přitom používají poměrně často.

ISO-2022 primárně používá 8bitové kódy, jedním z požadavků normy však bylo, aby kódování bylo použitelné i se 7bitovými komunikačními kanály. Je navržené tak, aby libovolnou 8bitovou posloupnost bylo možné zakódovat pomocí 7bitového kódu bez ztráty informace a obvykle pouze s malým přírůstkem velikosti.

Struktura kódu 
Kódování ISO/IEC 2022 určuje dvouvrstevné zobrazení mezi kódy znaků, pracovní sadou a skutečně zobrazovanými znaky. Pomocí escape sekvencí lze pro každou ze čtyř pracovních sad pojmenovaných G0 až G3 vybrat určitou sadu zobrazovaných znaků. Jiné řídicí posloupnosti slouží k výběru, jaká pracovní sada je přiřazena určité oblasti kódů.

Znakové kódy pokrývající 7bitové tisknutelné ASCII znaky (0x21–0x7E, příp. 0x20–0x7F) tvoří oblast „GL“ kódů (písmeno „L“ vyjadřuje, že jsou v tabulce znakových kódů „vlevo“), zatímco kódy z „horní části“ z intervalu (0xA0–0xFF, příp. 0xA1-0xFE) se tvoří oblast „GR“ kódů (jsou dostupné pouze pro 8bitový kód).

Kódům z oblasti GL je implicitně přiřazena sada G0 a kódům z oblasti GR sada G1. Toto přiřazení však může být změněno předchozí dohodou nebo řídicími sekvencemi:

Každá ze čtyř pracovních sad G0 až G3 může být 94znaková sada nebo sada s 94n znaky. Sady G1 až G3 mohou být také 96znakové nebo s 96n znaky. Sadu s 96 nebo 96n lze přiřadit do oblasti GL, pak ale nebudou dostupné znaky mezera a Del (s kódy 0x20 a 0x7F).

Pomocí escape sekvencí je možné definovat i mapování řídicích znaků z oblastí C0 (kódy 0x00-0x1F) a C1 (kódy 0x80-0x9F). Toto mapování je pouze jednoúrovňové, a v praxi se používá velice málo. Aby se neznemožnilo další přepínání sad, musí každá znaková sada použitá pro C0 obsahovat na pozici 0x1B znak ESC.

V tabulce jsou pro každou z funkcí SS2 a SS3 uvedeny 2 posloupnosti; první je tvořena jedním osmibitovým řídicím znakem (ze sady C1), druhá je tvořena posloupností 7bitových znaků (ESC 0x40 (@) až ESC 0x5F (_)), kterou lze vyvolat i v sedmibitovém kódu. Pro interval ESC 0x60 (`) až ESC 0x7E (~) jsou definovány dodatečné řídicí funkce. V tomto článku jsou escape sekvence popsány pomocí ASCII znaků, ve skutečnosti jsou definovány pomocí číselných hodnot bytů (kterým může být přiřazený jiný znak).

Escape sekvence pro přepnutí znakové sady mají tvar ESC I [I...] F, přičemž hranaté závorky naznačují, že může být použit jeden nebo více I-bytů (jako „intermediate“) z intervalu 0x20–0x2F, a poslední F byte (jako „final“) musí být z intervalu 0x40–0x7F (interval 0x30–0x3F je rezervovaný pro hodnoty F-bytů pro soukromé použití). I byty identifikují typ znakové sady a konkrétní znakovou sadu, zatímco F byte identifikuje samotnou znakovou sadu.

Stejné F-byty mají různý význam pro různé typy kódů; např. 94znaková sada zobrazovaných znaků určená pomocí ESC ( A až ESC + A není nijak příbuzná s 96znakovou sadou určenou ESC - A až ESC / A. A žádná nich nemá souvislost s 94n-znakovou sadou určenou ESC $ ( A až ESC $ + A atd.; to znamená, že poslední byty musí být interpretovány ve správném kontextu. (přičemž ESC A zcela bez I-bytů slouží pro sedmibitovou reprezentaci řídicího kódu 0x81 ze sady C1.)

Také řídicí znakové sady C0 a C1 jsou nezávislé; tak například sada řídicích znaků C0 určená ESC ! A je řídicí sada NATS pro textový přenos novinových článků, zatímco sada řídicích znaků vyvolaná sekvencí končící stejným písmenem ESC " A pro C1 je řídicí sada CCITT atributů pro Videotex.

Před F-byte je možné přidávat dodatečné I-byty pro rozšíření intervalu F-bytů. V současnosti je to použito pouze pro 94znakové sady, kterým byly přiřazeny kódy tvaru ESC ( ! F. Naopak, dosud nebyla registrována žádná multibytová 96znaková sada, takže příslušné posloupnosti uvedené výše jsou čistě teoretické.

Znakové sady ISO/IEC 2022 
Kódování znaků pomocí mechanismu ISO/IEC 2022 zahrnuje:
 ISO-2022-JP. Šířeji používané kódování pro japonštinu. Začíná v ASCII a obsahuje následující escape sekvence:
 ESC ( B  pro přepnutí na ASCII (1 byte na znak)
 ESC ( J  pro přepnutí na JIS X 0201-1976 (ISO/IEC 646:JP) Roman sada (1 byte na znak)
 ESC $ @  pro přepnutí na JIS X 0208-1978 (2 byty na znak)
 ESC $ B  pro přepnutí na JIS X 0208-1983 (2 byty na znak)
 ISO-2022-JP-1. Totéž jako ISO-2022-JP s jednou přídavnou escape sekvencí
 ESC $ ( D pro přepnutí na JIS X 0212-1990 (2 byty na znak)
 ISO-2022-JP-2. Vícejazyčné rozšíření ISO-2022-JP. Totéž jako ISO-2022-JP-1 s následujícími přidanými escape sekvencemi
 ESC $ A pro přepnutí na GB 2312-1980 (2 byty na znak)
 ESC $ ( C pro přepnutí na KS X 1001-1992 (2 byty na znak)
 ESC . A pro přepnutí na horní část ISO/IEC 8859-1, rozšířené Latin 1 sady (1 byte na znak) [určené pro G2]
 ESC . F  pro přepnutí na horní část ISO/IEC 8859-7, základní řecké sady (1 byte na znak) [určené pro G2]
 ISO-2022-JP-3. Totéž jako ISO-2022-JP s třemi přídavnými escape sekvencemi:
 ESC ( I  pro přepnutí na JIS X 0201-1976 Kana sada (1 byte na znak)
 ESC $ ( O pro přepnutí na JIS X 0213-2000 rovinu 1 (2 byty na znak)
 ESC $ ( P pro přepnutí na JIS X 0213-2000 rovinu 2 (2 byty na znak)
 ISO-2022-JP-2004. Totéž jako ISO-2022-JP-3 s jednou přídavnou escape sekvencí
 ESC $ ( Q pro přepnutí na JIS X 0213-2004 rovinu 1 (2 byty na znak)
 ISO-2022-KR. Kódování pro korejštinu.
 ESC $ ) C pro přepnutí na KS X 1001-1992, dříve pojmenovaný KS C 5601-1987 (2 byty na znak) [určené pro G1]
 ISO-2022-CN. Kódování pro čínštinu.
 ESC $ ) A pro přepnutí na GB 2312-1980 (2 byty na znak) [určené pro G1]
 ESC $ ) G pro přepnutí na CNS 11643-1992 rovinu 1 (2 byty na znak) [určené pro G1]
 ESC $ * H pro přepnutí na CNS 11643-1992 rovinu 2 (2 byty na znak)
 ISO-2022-CN-EXT. Totéž jako ISO-2022-CN s šesti přídavnými escape sekvencemi
 ESC $ ) E pro přepnutí na ISO-IR-165 (2 byty na znak) [určené pro G1]
 ESC $ + I pro přepnutí na CNS 11643-1992 rovinu 3 (2 byty na znak) [určené pro G3]
 ESC $ + J pro přepnutí na CNS 11643-1992 rovinu 4 (2 byty na znak) [určené pro G3]
 ESC $ + K pro přepnutí na CNS 11643-1992 rovinu 5 (2 byty na znak) [určené pro G3]
 ESC $ + L pro přepnutí na CNS 11643-1992 rovinu 6 (2 byty na znak) [určené pro G3]
 ESC $ + M pro přepnutí na CNS 11643-1992 rovinu 7 (2 byty na znak) [určené pro G3]

Znak po ESC (pro jednobytové znakové sady) nebo ESC $ (pro vícebytové znakové sady) určuje typ znakové sady a pracovní sada, který je navržené to. Ve výše uvedených příkladech znak ( (0x28) určuje 94znakovou sadu pro pracovní sadu G0. Pro přiřazení pracovních sad G1-G3 se místo ( použije ), * nebo + (0x29–0x2B).

Dva z výše uvedených kódů jsou 96znakové kódy a ve výše uvedených příkladech znak - (0x2D) určuje znakovou sadu pro G1. Tento může být nahrazen s . nebo / (0x2E nebo 0x2F) pro určení znakové sady G2 nebo G3. Jak bylo uvedeno dříve, 96znaková sada nemůže být použita jako sada G0.

Escape sekvence ESC $ @, ESC $ A a ESC $ B byly registrovány před dokončením standardu ISO/IEC 2022, a fungují jako synonyma posloupností ESC $ ( @ až ESC $ ( B pro definici pracovní sady G0. Změnou znaku ( v druhém formátu lze definovat pracovní sady G1 až G3.

Standard definuje i metodu, jak vybrat systémy kódování, které uvedené struktuře nevyhovují. Důležitá je především posloupnost ESC % G vybírající kódování UTF-8, u kterého interval 0x80–0x9F není rezervován pro řídicí znaky.

Porovnání s jiný kódování

Výhody 
 ISO/IEC 2022 umožňuje reprezentovat rozsáhlé znakové sady v systémech omezených na 7bitové kódy. Protože naprostá většina moderních počítačů již umožňuje pracovat s 8 bity v bytu, je tato vlastnost důležitá především z důvodu zpětné kompatibility se staršími systémy.
 Na rozdíl od Unicode se ISO/IEC 2022 přepínáním mezi sadami pro různé východoasijské jazyky vyhýbá problémům spojeným s Han unifikací, které se objevují u vícejazyčných CJK textů v jednom dokumentu nebo fontu.

Nevýhody 
 Protože ISO/IEC 2022 je stavové kódování, manipulace s textem při vyhledávání, vkládání nebo mazání znaků je v porovnání s bezstavovým kódováním velmi obtížná a pomalá. Jakýkoli skok v textu může vyžadovat návrat až k předchozí escape sekvenci, aby byly následující byty správně interpretovány.
 Protože stejný znak může být v ISO/IEC 2022 reprezentován několika způsoby (jednoduchý shift, locking shift nebo stejný znak z různých znakových sad) nelze spolehlivě porovnávat řetězce na rovnost.
 DICOM a některé e-mailové klientské programy používají varianty ISO-2022 pro podporu dalších kódování, což komplikuje přenos textu mezi různými systémy.
 Vícebytový transformační formát pro Unicode UTF-1, který je kompatibilní s ISO/IEC 2022, má oproti UTF-8 různé nevýhody a přepínání mezi znakovými sadami ve stylu ISO/IEC 2022 je v dokumentech používajících Unicode obvykle zbytečné.
 Lze vytvořit posloupnosti bytů, které mohou způsobit při převodu z ISO/IEC 2022 do Unicode a zpátky narušení bezpečnosti.

Odkazy

Reference

Literatura 
 Lunde, Ken. CJKV Information Processing. Cambridge, Massachusetts: O'Reilly & Associates, 1998. .

Související články 
 ISO/IEC 646
 Řídicí znak
 Standardy MARC

Externí odkazy 
 ISO/IEC 2022:1994
 ISO/IEC 2022:1994/Cor 1:1999
 Standard ECMA-35, ekvivalentní s ISO/IEC 2022 a volně dostupný.
 International Register of Coded Character Sets to be Used with Escape Sequences , úplný seznam přiřazených znakových sad a jejich escape sekvencí
 Historie znakových kódů v Severní Americe, Evropě a východní Asii
 CJK.INF: Dokument o kódování čínštiny, japonštiny a korejštiny (CJK), včetně diskuze různých variant ISO/IEC 2022. Také dostupné na WWW.
Dokumenty RFC
 RFC 1468: popis ISO-2022-JP
 RFC 2237: popis ISO-2022-JP-1
 RFC 1554: popis ISO-2022-JP-2
 RFC 1922: popis ISO-2022-CN a ISO-2022-CN-EXT
 RFC 1557: popis ISO-2022-KR

Kódování znaků
Standardy ECMA
02022
Standardy ISO podle id