A karakterkódolási rendszerek az informatikában módszert jelentenek betűk, számok és hasonló adatok (más szavakkal karakterek) megjelenítésére, amelyben egy karaktergyűjtemény minden karakteréhez egy-egy egyedi számot rendelünk hozzá. Például az ASCII karaktergyűjteményben az A betűhöz a 65-ös, a B betűhöz a 66-os, a C betűhöz a 67-es kódot rendelték hozzá.
Mindennek az értelme, hogy az informatikai eszközök (számítógép, faxgépek stb.) nagy része az emberi kommunikációra használatos ábécéket általában elektronikus (leggyakrabban digitális) formában tudják csak megjeleníteni, pl. egy számítógép az összes digitálisan megjeleníthető karaktert (így a betűk kis és nagy variánsait, valamint egyéb speciális karaktereket is) számok formájában tudja csak tárolni és egymástól megkülönböztetni. Ezeket a számokból álló rendszereket nevezik karakterkódoknak. A karakterkódolási rendszerek egy elég jól ismert példáját adják a morzejelek. A morzerendszerben a latin betűkhöz és arab számokhoz a távíró billentyű rövid vagy hosszú lenyomását rendelték hozzá.
Egy másik sokat olvasható karakterkódolási rendszer rövidítése az ún. ASCII (American Standard Code for Information Interchange). Ezt a rendszert 1963-ban vezették be hogy betűket, számokat és speciális szimbólumokat 7 biten tárolható számsorozatokkal helyettesítsenek az adattárolás folyamatában.
Ezeknek a karakterkódolási rendszereknek a kapacitás végessége komoly problémát jelentett. A morze például csak az arab számokat és a latin ábécé betűit reprezentálta, az ASCII 7 bites rendszerében pedig egy idő után beteltek a helyek, nem tudtak az új szimbólumokhoz egyedi számsorozatot rendelni, amire a Kelet Ázsiai nyelvek írásszimbólumainak befogadásához lett volna például szükség.
Egyszerű kódkészlet
Konvencionálisan a karakterkészlet és a karakterkódolás kifejezéseket azonos értelemben használják, mert néhány szabvány meghatározza a karaktereket és azt, hogyan lehet ezeket a karaktereket kódolni, pontosabban „visszakódolni” egy kódsorozatból (ami általában egy karakter kódegységenként). Történeti okokból, a MIME és azok a rendszerek, amelyek az ún. charset kifejezést használják, a karakterek sorozatát byte-ok sorozatára alakítják át.
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 byteok (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ó 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 "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 karakterek 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 037 és 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 viszont 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ódpontok 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, amíg a kódolt karakterek halmaza megfeleltethető 8 biten tárolható értékek halmazának (ami igaz a régebbi nem CJK kódokra), illetve megfeleltethető 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, 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, amelyek megpróbálják minimalizálni a kódegységekre jutó byte-ok számát (úgy mint SCSU, BOCU és Punycode).
A karakterkódolás története
Elterjedt karakterkódolások
- ISO 646
- EBCDIC
- ISO 8859:
- ISO 8859-1, ISO 8859-2, ISO 8859-3, ISO 8859-4, ISO 8859-5, ISO 8859-6, ISO 8859-7, ISO 8859-8, ISO 8859-9, ISO 8859-10, ISO 8859-11, ISO 8859-13, ISO 8859-14, ISO 8859-15, ISO 8859-16
- DOS karakterkészlet, még mint IBM code page-ek ismert:
- CP437, CP737, CP850, CP852, CP855, CP857, CP858, CP860, CP861, CP863, CP865, CP866, CP869
- Windows karakterkészlet:
- KOI8-R, KOI8-U, KOI7
- MIK
- ISCII
- VISCII
- Big5
- Guobiao
- ISO 2022, Shift-JIS, EUC
- Unicode (és részhalmaza, a 16 bites 'Alap Többnyelvű Lap' (Basic Multilingual Plane). Lásd UTF-8
Karakterkonverziós eszközök
Platformok között:
- iconv – fájlok tartalmát konvertálja egy adott kódról egy másik kódra
Linux:
- utrac – fájltartalmat konvertál egy kódról egy másik kódra [1]
- convmv – a fájlnevet konvertálja egy adott kódról egy másik kódra [2]
Kapcsolódó szócikkek
Egyéb, angol nyelvű linkek
- Character sets registered by Internet Assigned Numbers Authority
- Unicode Technical Report #17: Character Encoding Model
- SIL's freeware fonts, editors and documentation See SIL
- ICU Converter Explorer Archiválva 2020. január 2-i dátummal a Wayback Machine-ben
- The Cyrillic Charset soup
- Early history of character set standardization
- Character Sets And Code Pages At The Push Of A Button
- A complete introduction to Japanese character encodings
- A tutorial on character code issues Archiválva 2017. szeptember 17-i dátummal a Wayback Machine-ben
- Online Char (ASCII), HEX, Binary, Base64, etc... Encoder/Decoder with MD2, MD4, MD5, SHA1+2, etc. hashing algorithms
- Universal Cyrillic decoder, an online program that may help recovering unreadable Cyrillic texts with wrong character encodings (some others also).