Kódování s proměnnou šířkou - Variable-width encoding

Kódování s proměnnou šířkou je typ kódování znaků systému, v němž kódy různých délek se používají pro kódování znakové sady (repertoár symbolů) reprezentace, obvykle v počítači . Nejběžnější kódování s proměnnou šířkou jsou vícebajtová kódování , která ke kódování různých znaků používají různý počet bajtů ( oktetů ). (Někteří autoři, zejména v dokumentaci společnosti Microsoft, používají termín vícebajtová znaková sada, což je chybné pojmenování , protože velikost reprezentace je atributem kódování, nikoli znakové sady.)

Počáteční kódování s proměnnou šířkou s použitím méně než bajtu na znak se někdy používalo k zabalení anglického textu do menšího počtu bytů v adventurách pro rané mikropočítače . Avšak disky (které na rozdíl od pásek umožňovaly náhodný přístup umožňující načtení textu na vyžádání), nárůst paměti počítače a algoritmy pro kompresi obecného účelu způsobily, že tyto triky jsou do značné míry zastaralé.

Vícebajtová kódování jsou obvykle výsledkem potřeby zvýšit počet znaků, které lze kódovat, aniž by došlo k narušení zpětné kompatibility s existujícím omezením. Například s jedním bajtem (8 bitů) na znak lze kódovat 256 možných znaků; aby bylo možné kódovat více než 256 znaků, bylo by zjevnou volbou použít dva nebo více bytů na kódovací jednotku, dva bajty (16 bitů) by umožnily 65 536 možných znaků, ale taková změna by narušila kompatibilitu se stávajícími systémy, a proto nemusí být vůbec proveditelný.

Obecná struktura

Jelikož cílem vícebajtového kódovacího systému je minimalizovat změny stávajícího aplikačního softwaru, některé znaky si musí zachovat své již existující kódy jedné jednotky, i když jiné znaky mají ve svých kódech více jednotek. Výsledkem je, že existují tři druhy jednotek v kódování s proměnnou šířkou: singletony , které se skládají z jedné jednotky, vedoucí jednotky , které jsou na prvním místě ve vícejednotkové sekvenci, a stopové jednotky , které přicházejí později ve vícejednotkové sekvenci. Vstupní a zobrazovací software zjevně potřebuje vědět o struktuře vícebajtového kódovacího schématu, ale jiný software obecně nemusí vědět, zda dvojice bajtů představuje dva samostatné znaky nebo pouze jeden znak.

Například čtyřznakový řetězec „ I ♥ NY “ je kódován v UTF-8 takto (zobrazeno jako hexadecimální hodnoty bajtů): 49 E2 99 A5 4E 59 . Ze šesti jednotek v tomto pořadí je 49 , 4E a 59 singletů (pro I, N a Y ), E2 je vedoucí jednotka a 99 a A5 jsou trailové jednotky. Symbol srdce je představován kombinací hlavní jednotky a dvou trasových jednotek.

UTF-8 usnadňuje programu identifikovat tři druhy jednotek, protože spadají do různých rozsahů hodnot. Starší kódování s proměnnou šířkou obvykle není tak dobře navrženo, protože rozsahy se mohou překrývat. Aplikace pro zpracování textu, která se zabývá kódováním s proměnnou šířkou, pak musí naskenovat text od začátku všech definitivních sekvencí, aby identifikovala různé jednotky a správně interpretovala text. V takových kódováních se člověk může setkat s falešně pozitivními výsledky při hledání řetězce uprostřed textu. Pokud například hexadecimální hodnoty DE, DF, E0 a E1 mohou být buď olověnými jednotkami, nebo stopovými jednotkami, pak hledání sekvence dvou jednotek DF E0 může poskytnout falešně pozitivní výsledek v sekvenci DE DF E0 E1, která skládá se ze dvou po sobě jdoucích dvoujednotkových sekvencí. Existuje také nebezpečí, že jedna poškozená nebo ztracená jednotka může způsobit, že celá interpretace velkého běhu vícejednotkových sekvencí bude nesprávná. V kódování s proměnnou šířkou, kde jsou všechny tři typy jednotek disjunktní, vyhledávání řetězců vždy funguje bez falešných poplachů a (za předpokladu, že je dekodér dobře napsán) ​​poškození nebo ztráta jedné jednotky poškodí pouze jeden znak.

Vícebajtové kódování CJK

První použití vícebajtového kódování bylo pro kódování čínštiny, japonštiny a korejštiny, které mají velké sady znaků výrazně přesahující 256 znaků. Zpočátku bylo kódování omezeno na limit 7 bitů. ISO-2022-JP, ISO-2022-CN a ISO-2022-KR kódování používá rozsah 21-7E (hexadecimální) pro obě hlavní jednotky a TRAIL jednotek, a označené je pryč od singletons pomocí ISO 2022 escape sekvencí přepínání mezi jednobajtovým a vícebajtovým režimem. Celkem 8836 (94 × 94) znaků mohlo být nejprve kódováno a další sady 94 × 94 znaků s přepínáním. Schémata kódování ISO 2022 pro CJK se na internetu stále používají. Stavová povaha těchto kódování a velké překrývání je činí velmi nepříjemnými pro zpracování.

Na platformách Unix byla 7bitová kódování ISO 2022 nahrazena sadou 8bitových kódovacích schémat, rozšířeného unixového kódu: EUC-JP, EUC-CN a EUC-KR. Namísto rozlišení mezi vícejednotkovými sekvencemi a singletony s únikovými sekvencemi, které kódování učinily stavovými, byly vícejednotkové sekvence označeny tím, že mají nejvýznamnější bitovou sadu, to znamená, že jsou v rozmezí 80 – FF (hexadecimální), zatímco singletony byly pouze v rozsahu 00–7F. Vedoucí jednotky a stopové jednotky byly v rozsahu A1 až FE (hexadecimální), to znamená stejné jako jejich rozsah v kódování ISO 2022, ale s vysokým bitem nastaveným na 1. Tato kódování byla poměrně snadno zpracovatelná za předpokladu, že všechny vaše oddělovače byly znaky ASCII a vyhnuli jste se zkracování řetězců na pevné délky, ale přerušení uprostřed vícebajtové postavy by stále mohlo způsobit velké poškození.

Na PC ( platformy DOS a Microsoft Windows ) byla zavedena dvě kódování pro japonštinu a tradiční čínštinu, ve kterých se překrývaly všechny singletony, hlavní jednotky a jednotky tras: Shift-JIS a Big5 . V Shift-JIS měly vedoucí jednotky rozsah 81–9F a E0 – FC, trailové jednotky měly rozsah 40–7E a 80 – FC a singletony měly rozsah 21–7E a A1 – DF. V Big5 měly vedoucí jednotky rozsah A1 – FE, trailové jednotky měly rozsah 40–7E a A1 – FE a singletony měly rozsah 21–7E (všechny hodnoty v šestnáctkové soustavě). Toto překrývání opět způsobilo, že zpracování bylo složitější, přestože alespoň většina symbolů měla jedinečné hodnoty bajtů (ačkoli zpětné lomítko kupodivu nemá).

Kódování proměnné šířky Unicode

Standard Unicode má dvě kódování s proměnnou šířkou: UTF-8 a UTF-16 (má také kódování s pevnou šířkou, UTF-32 ). Původně měly být standardy Unicode i ISO 10646 pevné šířky, přičemž Unicode byl 16bitový a ISO 10646 32bitový. ISO 10646 poskytla kódování s proměnnou šířkou s názvem UTF-1 , ve kterém singlety měly rozsah 00–9F, vedoucí jednotky rozsah A0 – FF a trailové jednotky rozsahy A0 – FF a 21–7E. Kvůli tomuto špatnému designu, podobnému Shift JIS a Big5 v překrývání hodnot, vynálezci operačního systému Plan 9 , první implementující Unicode v celém rozsahu, od něj upustili a nahradili jej mnohem lépe navrženým kódováním s proměnnou šířkou pro Unicode : UTF-8, ve kterém mají singlety rozsah 00–7F, vedoucí jednotky mají rozsah C0 – FD (nyní vlastně C2 – F4, aby se zabránilo příliš dlouhým sekvencím a aby byla zachována synchronizace s kódovací kapacitou UTF-16; viz UTF -8 článek) a trailové jednotky mají rozsah 80 – BF. Vedoucí jednotka také říká, kolik stopových jednotek následuje: jedna po C2 – DF, dvě po E0 – EF a tři po F0 – F4.

UTF-16 byl navržen tak, aby se vymanil z limitu 65 536 znaků původního Unicode (1.x), aniž by došlo k porušení kompatibility se 16bitovým kódováním. V UTF-16 mají singletony rozsah 0000 – D7FF (55 296 kódových bodů) a E000 – FFFF (8192 kódových bodů, 63 488 celkem), vedoucí jednotky dosah D800 – DBFF (1024 kódových bodů) a trailové jednotky rozsah DC00– DFFF (1024 kódových bodů, celkem 2048). Olovo a stopové jednotky, v terminologii Unicode označované jako vysoké a nízké , v daném pořadí, mapují 1024 × 1024 nebo 1 048 576 doplňkových znaků, takže kódovatelné kódové body jsou 1 112 064 (63 488 kódových bodů BMP + 1 048 576 kódových bodů reprezentovaných vysokými a nízkými náhradními páry) , nebo skalární hodnoty v jazyce Unicode (zástupné výrazy nelze kódovat).

Viz také

Poznámky

Reference