„Karakterkódolás” változatai közötti eltérés

[nem ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
a Visszaállítottam a lap korábbi változatát: 195.199.229.121 (vita) szerkesztéséről Regasterios szerkesztésére
12. sor:
 
== A modern kódolási modell ==
 
A [[Unicode]] és a vele párhuzamos szabvány, az ISO 10646 [[univerzális karakterkészlet]] – Universal Character Set (UCS), amelyek a legmodernebb karakterkódolást testesítik meg, szakítanak az egy karakter egy byte elvvel. Eltérően a egy-az-egy elvtől, a kezelt karaktereket "kódegységek" (korlátozott hosszúságú számok) sorozatának tekinti, majd végül ezt a szám sorozatot [[byte]]ok (8 bites egységek) sorozataként tárolja, illetve ábrázolja. Ez a dekompozíciós elv biztosítja, hogy felépíthető egy univerzális karakterkészlet, amely több módon is kódolható, illetve a kódból visszaállítható. A modell pontos és helyes leírásához azonban szükség van arra, hogy a "karakterkészlet" illetve "karakterkódolás" kifejezéseket az eddig használtaknál pontosabban határozzák meg. A modern modellben használt kifejezések a következők:
 
Egy '''karakterkészlet''' vagy '''karakterrepertoár''' (character repertoire) a rendszer által támogatott karakterek teljes készlete. Ez a készlet lehet zárt, azaz nem megengedett a bővítés, amíg egy új szabvány változat életbe nem lép (mint az ASCII és a legtöbb ISO-8859 sorozat esetében), vagy lehet nyitott, azaz a bővítés megengedett (mint a Uncode esetében, és korlátozottan a [[Windows code pages]] esetében). Hogy mit tekintünk egy adott karakter készlet esetén egy elemnek, azaz egy karakternek, az attól függ, hogy az adott írásrendszerben milyen lineáris információegységeket határozhatunk meg. Alapesetben a latin, görög, cirill ábécék feloszthatók betűkre, számokra, elválasztó jelekre és néhány speciális karakterre, mint például a szóköz, amelyek lineáris sorozatot alkotnak, abban az értelemben, hogy olyan sorrendben jeleníthetők meg, amilyen sorrendben azokat olvasni is fogják. Még ezeknél az ábécéknél is komplikációt jelentenek az úgynevezett [[diakritikus jelek]], amelyek kezelhetők, mint különálló karakterek, vagy mint karakter és diakritikus jel együttesen (a modern terminológiában ez az úgynevezett "előre összeállított karakter"). Más írás rendszerek esetében, mint például az arab vagy héber, a karakterkészletnek sokkal komplexebbnek kell lennie, tekintettel a kétirányú (bidirectional) megjelenítésre, valamint arra a tényre, hogy az egymáshoz csatlakozó [[glifa|glifák]] különböző helyzetekben különbözőek lehetnek.
 
A '''kódolt karakterhalmaz''', (coded character set) határozza meg azt, ahogyan megjeleníti a karakterkészlet egy adott elemét, egy nem negatív, egész számként, amit '''kód''' vagy '''kód pont''' néven is neveznek. Például, egy adott karakterkészlet esetében egy karakterhez, ami a Latin ábécé nagy "A" betűjét jelenti, a 65 egész értéket rendelhetjük, a a "B" karakterhez a 66-ot, és így tovább. Az összes kezelni kívánt karakter a hozzájuk tartozó egész számokkal együtt alkotja a kódolt karakaterek halmazát. A többszörösen kódolt karakterek halmaza, lehet megosztott, mint például az [[ISO-8859-1]] és az IBM code pages [[code page 037|037]] és [[code page 500|500]]. A karakterek azonosak, azonban más kódok tartoz(hat)nak hozzájuk. Egy kódolt karakterhalmazban egy kódérték, vagy kódpont csak egy karaktert jelölhet ki.
 
A '''karakterkódolási forma''' (character encoding form – CEF) írja le azt a konverziót, ami meghatározza, hogyan lesznek a kódolt karakterek halmazában lévő egész értékekből (a kódpontok) a korlátozott hosszúságú egészek, a '''kódértékek''', amiket a rendszer tárolni tud, azaz fix hosszúságú, bináris számként megjeleníteni. Például, egy rendszer, ami a numerikus információkat 16 bites egységekben tárolja, a 0 és a 65 535 közé eső egész számokat képes egy egységben tárolni. A nagyobb egészeket viszon csak úgy tudja ábrázolni, ha több, mint egy 16 bites egységet használ. Ez az, amit a CEF meghatároz: meghatároz egy leképezési eljárást, amely a lehetséges egyedi kód'''pont'''ok tartományát, amely legyen mondjuk 0 és 1,4 millió közötti, átviszi ''egy vagy több'', mondjuk a 0 és a 65 535 közé eső tartományba eső értékek sorozatává, ami a kód''érték''.
 
Az egyszerűbb karakterkódolási formát (CEF) használó kódok egyszerűen elegendően nagy egységet választanak a kódértékek tárolására, tehát a kódolt karakterek halmazát egy-az-egy megfeleltetésbe hozzák az adott egységen tárolható értékek halmazával. Az eljárás jól működik addig, amig a kódolt karakterek halmaza megfeleltethető 8-biten tárolható értékek halmazának (ami igaz a régebbi nem CJK kódokra), illetve megfeleltetehető 16-biten tárolható értékek halmazának (a Unicode korábbi változata). Azonban a kódolt karakterek halmazának mérete egyre növekszik (a modern Unicode legalább 21 bitet igényel karakterenként), az egyszerű módszer egyre kevésbé hatékony, és egyre nehezebb a létező rendszerekben megvalósítani a nagyobb/hosszabb kód értékek használatát. Ezért a legtöbb rendszer a Unicode régebbi változatait használja, vagy az [[UTF-8]]-at, ahol a Unicode kód pontjait változó hosszúságú, 8 bites értékek sorozatára, vagy az [[UTF-16]]-ot, ahol a Unicode kód pontjait változó hosszúságú, 16 bites értékek sorozatára konvertálja.
 
Végül, egy '''karakterkódolási séma''', (character encoding scheme – CES) határozza meg, hogy hogyan lehet a fix hosszúságú, egész számot, a kód értékét, ami egy 8 bites egységekből álló sorozatként tárolni, akár a memóriában, akár egy fájlrendszerben vagy így továbbítani adatátviteli vonalon. A Unicode a legtöbb esetben egy egyszerű karakterkódolási sémát használ: egyszerűen meghatározza, hogy egy egész byte-jainak big-[[endian]] vagy little-endian elrendezésűnek kell lennie (az UTF-8 estén még ez sem szükséges). Bár léteznek összetett karakter dekódolási sémák is, amelyek eszkép szekvenciákat használnak a számos egyszerű séma közötti átkapcsolásra (mint az [[ISO 2022]]), és léteznek tömörítő sémák, amlyek megpróbálják minimalizálni a kódegységekre jutó byte-ok számát (úgy mint [[Standard Compression Scheme for Unicode|SCSU]], [[BOCU]], és [[Punycode]]).
 
== A karakterkódolás története ==