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é[1] 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 editovat

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 editovat

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:

Kód Zkratka Jméno Výsledek
0x0F SI
LS0
Shift In
Locking shift zero
GL kóduje od tohoto místa G0
0x0E SO
LS1
Shift Out
Locking shift one
GL kóduje od tohoto místa G1
ESC 0x6E (n) LS2 Locking shift two GL kóduje od tohoto místa G2
ESC 0x6F (o) LS3 Locking shift three GL kóduje od tohoto místa G3
0x8E
ESC 0x4E
(N)
SS2 Single shift two GL kóduje G2 pouze pro další znak
0x8F
ESC 0x4F
(O)
SS3 Single shift three GL kóduje G3 pouze pro další znak
ESC 0x7E (~) LS1R Locking shift one right GR kóduje od tohoto místa G1
ESC 0x7D (}) LS2R Locking shift two right GR kóduje od tohoto místa G2
ESC 0x7C (|) LS3R Locking shift three right GR kóduje od tohoto místa G3

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 (@)ESC 0x5F (_)), kterou lze vyvolat i v sedmibitovém kódu. Pro interval ESC 0x60 (`)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.

Kód Hex Zkratka Jméno Výsledek
ESC ! F 1B 21 F CZD výběr sady C0 F vybere řídicí znakovou sadu C0.
ESC " F 1B 22 F C1D výběr sady C1 F vybere řídicí znakovou sadu C1.
ESC % F 1B 25 F DOCS výběr jiného systému kódování F vybere 8bitový kód; použít ESC % @ pro návrat do ISO/IEC 2022.
ESC % / F 1B 25 2F F DOCS výběr jiného systému kódování F vybere 8bitový kód; neexistuje žádný standardní způsob pro návrat.
ESC ( F 1B 28 F GZD4 výběr 94znakové sady pro G0 F vybere 94znakovou sadu pro G0.
ESC ) F 1B 29 F G1D4 výběr 94znakové sady pro G1 F vybere 94znakovou sadu pro G1.
ESC * F 1B 2A F G2D4 výběr 94znakové sady pro G2 F vybere 94znakovou sadu pro G2.
ESC + F 1B 2B F G3D4 výběr 94znakové sady pro G3 F vybere 94znakovou sadu pro G3.
ESC - F 1B 2D F G1D6 výběr 96znakové sady pro G1 F vybere 96znakovou sadu pro G1.
ESC . F 1B 2E F G2D6 výběr 96znakové sady pro G2 F vybere 96znakovou sadu pro G2.
ESC / F 1B 2F F G3D6 výběr 96znakové sady pro G3 F vybere 96znakovou sadu pro G3.
ESC $ F
ESC $ ( F
1B 24 F
1B 24 28 F
GZDM4 výběr multibytové 94znakové sady pro G0 F vybere 94n-znakovou sadu pro G0.
ESC $ ) F 1B 24 29 F G1DM4 výběr multibytové 94znakové sady pro G1 F vybere 94n-znakovou sadu pro G1.
ESC $ * F 1B 24 2A F G2DM4 výběr multibytové 94znakové sady pro G2 F vybere 94n-znakovou sadu pro G2.
ESC $ + F 1B 24 2B F G3DM4 výběr multibytové 94znakové sady pro G3 F vybere 94n-znakovou sadu pro G3.
ESC $ - F 1B 24 2D F G1DM6 výběr multibytové 96znakové sady pro G1 F vybere 96n-znakovou sadu pro G1.
ESC $ . F 1B 24 2E F G2DM6 výběr multibytové 96znakové sady pro G2 F vybere 96n-znakovou sadu pro G2.
ESC $ / F 1B 24 2F F G3DM6 výběr multibytové 96znakové sady pro G3 F vybere 96n-znakovou sadu pro G3.

Stejné F-byty mají různý význam pro různé typy kódů; např. 94znaková sada zobrazovaných znaků určená pomocí ESC ( AESC + A není nijak příbuzná s 96znakovou sadou určenou ESC - AESC / A. A žádná nich nemá souvislost s 94n-znakovou sadou určenou ESC $ ( AESC $ + 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 editovat

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í
  • 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[2]
    • 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:
  • ISO-2022-JP-2004. Totéž jako ISO-2022-JP-3 s jednou přídavnou escape sekvencí
  • ISO-2022-KR. Kódování pro korejštinu.
    • ESC $ ) C pro přepnutí na KS X 1001-1992,[3][4] 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 $ ( @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í editovat

Výhody editovat

  • 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 editovat

  • 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í[5], 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.[6]

Odkazy editovat

Reference editovat

V tomto článku byl použit překlad textu z článku ISO/IEC 2022 na anglické Wikipedii.

  1. Standard ECMA 35 [online]. Dostupné online. 
  2. RFC 1554 - ISO-2022-JP-2: Vícejazyčné rozšíření ISO-2022-JP. tools.ietf.org. Načteno 2014-05-20.
  3. KS X 1001:1992 [online]. Dostupné online. 
  4. KS C 5601:1987 [online]. 1988-10-01 [cit. 2015-09-01]. Dostupné v archivu pořízeném dne 2014-05-12. 
  5. DICOM ISO 2022 variation [online]. [cit. 2015-09-01]. Dostupné v archivu pořízeném dne 2013-04-30. 
  6. http://bugzilla.mozilla.org/show_bug.cgi?id=935453

Literatura editovat

  • Lunde, Ken. CJKV Information Processing. Cambridge, Massachusetts: O'Reilly & Associates, 1998. ISBN 1-56592-224-7.

Související články editovat

Externí odkazy editovat

Dokumenty RFC