Vezérlőkarakter

A Wikipédiából, a szabad enciklopédiából

A számítástechnikában a vezérlőkarakter vagy nem nyomtatható karakter (angol kifejezéssel control character) egy olyan kód (egy szám) egy kódkészletben, ami önmagában nem felel meg egyetlen írott szimbólumnak sem. Az ASCII kódtábla minden 32 alatti eleme (technikailag a C0 vezérlőkódkészlet) közéjük tartozik, többek között a BEL (ami hangjelzést vált ki, ha a végberendezés veszi), a SYN (ami szinkronizálja a jeleket), és az ENQ (egy jelzés, ami kivált valamilyen választ a vételét követően, így ellenőrizhető, hogy az összeköttetés még fennáll-e). A Unicode szabvány újabb nem nyomtatható karakterekkel egészítette ki vezérlőkarakter-készletet. Az ASCII és az ISO 8859-n által használt részletes C0 és C1 vezérlőkódok tábláit lásd a megfelelő szócikkeknél.

ASCII-vezérlőkarakterek[szerkesztés]

Az ASCII vezérlőkarakterei közül a legismertebbek:

  • 7 (bell – harang vagy csengő) – vétele esetén valamilyen figyelmeztető jelet (általában hangjelzést) vált ki
  • 8 (backspace – visszalépés) – az utolsó nyomtatott karakter törlésére vagy felülnyomtatásra (overprint) használható
  • 9 (horizontal tab – vízszintes tabulátor) – a jelenlegi nyomtatási pozíciót adott számú szóközzel jobbra helyezi
  • 10 (line feed – soremelés) – a legtöbb Unix rendszer és ezek változatai a sor végének jelzésére használják
  • 12 (form feed – lapdobás) – hatására a nyomtató új lapot kezd (lapdobás), vagy az aktuális nyomtatási pozíció egy új lap első sorának kezdő pozíciójára helyeződik át, a képernyős kijelzők törlik az aktuális képernyőtartalmat.
  • 13 (carriage return – kocsi vissza) – a sor végének jelzésére használja a Mac OS, az OS-9, a FLEX és változataik. A kocsi vissza/soremelés – carriage return/line feed – párosítást használja a CP/M-80 és a belőle kinőtt rendszerek, egészen a DOS-ig, valamint a Windows, az alkalmazási réteg és a protokollok, mint például a HyperText Transfer Protocol (HTTP)
  • 27 (escape)

Időnként a modern alkalmazások is használnak más vezérlőkódokat: például a 4 (end of transmission – átvitel vége) kódot használja a Unix shell vagy a PostScript nyomtató adatátvitelnél.

A 27 (Escape) kód több funkcióval is bír. Szinte ez a legtöbbet használt vezérlőkarakter: az alapkoncepció szerint a nyomtatható és eszközvezérlő információkat keverten is el lehet küldeni. Ehhez azonban szükséges, hogy egyértelműen felismerhető legyen, meddig tartanak a nyomtatható karakterek, és mikor kell a küldött karaktereket vezérlőkarakterként értelmezni. Megállapodás alapján az ESC karaktert követő karaktert vagy karaktereket nem tekinti a berendezés nyomtatható karakternek, még akkor sem, ha kódja alapján az lenne. Ezért neveznek bizonyos karakterkombinációkat „vezérlőszekvenciának” vagy „escape-szekvenciának”, illetve így lehet klaviatúrán vezérlőkaraktereket „előállítani” (lásd később). A mechanizmust az ASCII-kód atyja, Bob Bemer vezette be.

Általában a 27 kódot küldik először, majd az ezt követő egy vagy több nyomtatható karaktert értelmezik úgy, hogy azok speciális akciókat indítanak el – ha a vezérlő vagy a vezérlő meghajtója erre fel van készítve. A karakterszekvencia után a következő karaktereket már ismét normál nyomtatható karakterként értelmezi a berendezés. Például, a 27 kód után küldött nyomtatható karakterek "[2;10H" a Digital VT-102 terminálján a kurzort a képernyő 2 sorának 10. cellájára pozicionálták. Számos szabványt dolgoztak ki ilyen szekvenciákra, például az ANSI X3.64 (1979-ben), amelyik a VT-100 sorozatú terminálok viselkedését „emulálta”. Sajnos nagy számú, nem szabványos variációt is alkalmaztak, különösen a printerek körében, mivel a technológia gyorsabban fejlődött, mint a szabványok, viszont ez a kompatibilitás szempontjából egyáltalán nem volt elfogadható: egy nyomtató helyett nem lehetett automatikusan egy másikat alkalmazni.

Vezérlőkarakterek és a billentyűzet[szerkesztés]

Nagyon fontos megérteni, hogy a billentyűzet – önmagában – semmiféle karakterkódot nem küld a PC felé, hanem úgynevezett „scancode” érkezik a billentyűzet vezérlőjéhez (driveréhez), ami ezekből a „scancode”-ból készít – többnyire – ASCII-kódokat.

Az általában használatos billentyűzeteken van egy speciális billentyű, amit „Kontroll” vagy „Ctrl” (néhány esetben „Cntl”) felirattal láttak el. Ez a billentyű a Shift billentyűhöz hasonlóan használható, azaz egy másik billentyűvel együtt lenyomva másik betűt vagy más jelet generál. Ily módon generálható az a 32 kód, amely megfelel az ASCII vezérlőkaraktereinek. Mivel az ASCII-kód kisbetűi (ideértve a @ jelet is) decimálisan 64-nél kezdődnek, a Ctrl billentyű lenyomásával együtt lenyomott kisbetű hatására keletkező ASCII-kód értéke nem más, mint az adott kisbetű decimális kódjából levonva 64. Így pontosan a megfelelő ASCII-vezérlőkaraktereket kapjuk.

Ha a generált kódokat bináris formában ábrázoljuk, látható, hogy balról a második bit (6. bit, 26, ami pontosan 64) nullára állításával – amit a Ctrl használata eredményez – a vezérlőkarakterek egyszerűen előállíthatók. Például a „Ctrl” és a G billentyűt (kódja 71 decimálisan, ami megfelel a 01000111-nek binárisan) együttesen lenyomjuk, akkor a generált kód a Bell (decimálisan 7 vagy binárisan 00000111).

A fenti megoldás miatt gyakran jelenítik meg a vezérlőkaraktereket úgy, hogy az a "ctrl" és egy nyomtatható karakter kombinációja. A „Ctrl” jelzésére a ^ jelet használják, a jelölési módot pedig Ctrl-szekvenciának nevezik; például a ^G a 7 (bell) kódot jelenti, és a Ctrl és a G billentyűk együttes leütésével keletkezik.

A billentyűzeteken van néhány billentyű, amely önmagában is képes vezérlőkarakterek generálására. Például a „Backspace” általában a 8-as kódot, a „Tab” a 9-es kódot, az „Enter” vagy „Return” a 13-as kódot generálják (egyes billentyűzetek az „Enter” hatására a 10-es kódot generálják).

Modern billentyűzeteken vannak olyan billentyűk, amelyekhez nem lehet ASCII-kódot rendelni, ilyenek például a kurzormozgató nyilak és a szövegszerkesztő funkciók. Ezek a karakterek a következő háromféle mód valamelyikével állíthatók elő: vagy nem használt vezérlőkaraktereket rendelnek az egyes funkciókhoz (billentyűkhöz), vagy nem ASCII-kódolást használnak, vagy több karakterből álló vezérlőszekvenciákat használnak. A PC-hez használható billentyűzetek többnyire az első két módszer valamelyikét használják, viszont a „buta” terminálok inkább a kontrollszekvenciákat használják.

Használatuk[szerkesztés]

A vezérlőkarakterek alapvetően a következő csoportokba sorolhatók:

  • nyomtatás és a megjelenítés vezérlése
  • adatok strukturálása és az adatátvitel vezérlése
  • vegyes

A nyomtatás és a megjelenítés vezérlése[szerkesztés]

A nyomtatásvezérlő karakterek először a nyomtatóknak, a legelső megjelenítő eszközöknek fizikai működését vezérelték.

A „kocsi vissza” karakter, ha elküldték valamilyen berendezésnek, azt eredményezte, hogy a nyomtatómechanika – ha volt – az adott sor első nyomtatási pozíciójába állt. (Egyes berendezések esetében nem az aktuális sor elejére, hanem a következő sor elejére pozicionált a nyomtató.)

A „soremelés” hatására a nyomtatási pozíció egy sorral lejjebb került. A berendezés kialakításától függően a nyomtatási pozíció a következő sor elejére is kerülhetett – európai nyelvek esetében a lap bal oldalára, arab és héber nyelvek esetében a lap jobb oldalára.

„Vízszintes vagy függőleges tabulálás” esetén – ha a berendezés képes volt értelmezni a vezérlőkaraktert – az adott tabulátorpozíciónak megfelelő helyre pozicionálódott a nyomtatást végző eszköz.

A „form feed” karakter hatására egy új lap kezdetére állt a nyomtató berendezés.

A „visszalépés” vezérlőkarakter az aktuális pozíciótól egy lépéssel visszaléptette a nyomtatót, így lehetőség nyílt arra, hogy felülnyomtatással elő lehessen olyan karaktert is állítani, ami normál esetben nem nyomtatható. Terminálok és képernyős eszközök esetében választani lehetett, hogy a vezérlő szoftver (vagy hardver) konvertálja-e a vett visszaléptetést egy un. destruktív törlési szekvenciává (ami BS SP BS), vagy csak lépjen vissza egy nyomtatási (kijelzési) pozícióval.

A „shift in” és „shift out” küldésével az esetlegesen beépített másik kódkészletre való át- és visszatérést lehetett szabályozni, így – megvalósítástól függően – lehetett például cirill vagy görög, esetleg speciális karaktereket nyomtatni. Az „escape szekvenciák” hasonló célokat szolgáltak.

A terminálok fejlődésének következtében a fizikai nyomtatások vezérlése helyett a sokkal flexibilisebb képernyős megjelenítés vette át a főszerepet, így a szavak, sorok vagy teljes képernyő törlésére kezdték alkalmazni a különböző vezérlőkaraktereket. A „form feed” például a törölte a képernyőt, mivel megszűnt az új lap, amire nyomtatni lehet. Az eddig használtaknál bonyolultabb escape szekvenciákat kellett használni, hogy a különféle fejlesztési/fejlődési lehetőségeket minél jobban ki lehessen használni mind a terminálok képernyőin, mind pedig a nyomtatókon. Az eddig jól alkalmazható koncepció, a vezérlőkarakterek használata a funkciók számának növelésével egyre inkább szűkítette a lehetőségeket a vezérlőkarakterek korlátozott száma miatt. A vezérlőszekvenciák (escape szekvenciák) jobban megfeleltek a változó körülmények között, és nagyon nagy számban és változatban alkalmazzák is őket, viszont éppen a nagy számú, többnyire eltérő szekvenciák kezelése kritikus a kompatibilitás miatt.

Adatok strukturálása[szerkesztés]

A különféle elválasztók (fájl-, csoport-, rekord- és egységelválasztók) az adatok strukturálására készültek, főként szalagon tárolt adatok esetén, hogy szimulálni lehessen a lyukkártyákat. A „hordozó vége” figyelmeztetett a szalag (vagy bármi más) végére. Mivel a legtöbb mai rendszer a CR/LF és TAB karaktereket használja az adatok strukturálására (ezeket a karaktereket gyakran elválasztásvezérlő karaktereknek is nevezik), ezért inkább ezeket az elválasztásvezérlő karaktereket kell manapság használni, szemben a definiált vezérlőkarakterekkel. Ezek a karakterek nem használhatók más célokra, nem definiálhatók át: csak és kizárólag adatok strukturált elválasztása és csoportosítása a feladatuk.

Adatátvitel vezérlése[szerkesztés]

Az adatátvitel vezérlésére használt/tervezett karakterek biztosítják, hogy a két végpont közötti adatátvitel vezérelhető, ellenőrizhető és megbízható (hibamentes) legyen – a lehetőségeken belül. A hibátlanság biztosítása végső esetben úgy történik, hogy ha a hiba nem javítható, akkor legalább azt a tényt jelzi, hogy nem biztosítható a hibamentes átvitel.

Az SOH (start of header – fejléc kezdete) jelzi, hogy nem adat-blokk következik – a blokk az adatátvitel vezérlése, ellenőrzése szempontjából fontos adatokat tartalmaz – indikátor funkciót lát el. A tényleges adatot – szöveget – az STX (start of text – szöveg kezdete) jelzi, vételét követően érkezik a valódi üzenet. Ha ez az üzenet szöveg, akkor semmi egyéb teendő nincsen vele, ha viszont bitsorozat, akkor a DLE vezérlőkarakterek beszúrásával kell egy vezérlőkarakter kódjával megegyező kódot „hatástalanítani”. Értelemszerűen a DLE kód is átvihető, ebben az esetben a DLE DLE megoldást kell használni. A szöveges vagy bitfolyam blokk végét az ETX (end of text – szöveg vége) karakter jelzi. Általában ezt a vezérlőkaraktert két ellenőrző karakter követi, az úgynevezett checksum vagy ellenőrző összeg, illetve a CRC, amelyeket az adó oldalon az átvitt blokk alapján számolnak ki, és a vételi oldalon ellenőrzik a hibák kiszűrésére.

Az ESC (escape) karakter, annak ellenére, hogy vezérlőkarakter, az adatátvitel vezérlésében általában nem vesz részt, azaz közönséges karakternek számít, mégis külön kell vele foglalkozni: általános szabály szerint DLE ESC formában átvihető az üzenetben, bizonyos eljárásokban azonban ESC ESC formában kell átvinni. A szükséges DLE ill. ESC beszúrásokat vagy az adatátviteli vezérlőnek, vagy – kevésbé intelligens berendezés esetében – a programozónak kell biztosítania a küldő oldalon, illetve a vevő oldalon gondoskodni kell az eltávolításukról.

A NAK karakter, a negatív nyugtázás egy olyan jelző, ami jelzi a küldő oldal számára, hogy az átvitel folyamán valamilyen rendellenesség történt. Általában a NAK vétele kiváltja az előző üzenet (adatblokk) újraküldését. Annak elkerülésére, hogy egy hiba állandó előfordulása miatt az újraküldések vételen ciklusba kerüljenek, az egymás követő negatív nyugtázások számát korlátozzák, és megszakítják az átvitelt a megfelelő hibajelzés kíséretével. A pozitív nyugtázás, az ACK hatására a következő adatblokk át lesz küldve, illetve egy EOT-vel jelezni tudja a küldő, hogy nincs több küldendő adata.

Ha az átviteli közeg fél-duplex, azaz egy időben csak egy átviteli irányban lehetséges átvitel a végpontok között, a vezérlő állomás (általában az, aki a kapcsolatfelvételt kezdeményezte, ha egyéb konvencióból ez nem derül ki) lehetőséget biztosít arra, hogy az ellenállomás vagy az ellenállomások több pontos kapcsolat esetében szintén küldhessenek adatokat. Erre szolgál az ENQ (enquiry – lekérdező) vezérlőkarakter, amit csak a vezérlő állomás küldhet. A ENQ vételére az állomás vagy elküldi a jelzését, hogy van küldeni való adatblokkja, vagy jelzi, hogy nincsen küldeni valója. Maga az adatküldés a fentiekben leírtak alapján történik a másik irányban is. A lényeges különbség az, hogy a vezérlő (master) állomás megszakíthatja az adatküldést, és fordíthat az átviteli irányon, küldhet újabb adatokat, míg ilyet illetve ENQ küldést az alárendelt állomások nem tehetnek.

A különböző vezérlőkarakterek küldésén kívül még több időzítés kezelése is biztosítja, hogy az átvitel ellenőrizhető és kezelhető legyen, ne akadhasson fel.

Az eszközvezérlő karaktereket eredetileg általános célokra tervezték, és minden berendezésben meg is valósították a kezelésüket. Gondot jelentett azonban, hogy az általános megoldásban nem volt lehetőség arra, hogy az átvitelt egy berendezés leállíthassa, mert például pillanatnyilag nem képes több adatot fogadni. A Digital Equipment Corporation kidolgozott egy megoldást, amelyben a 19-es kódot (az eszközvezérlő 3 nevű karaktert, ami a Ctrl+S kombinációval lehet billentyűzetről generálni, vagy ismertebb nevén „X-OFF”) az átvitel leállítására, míg a 17-es kódot (az eszközvezérlő 2 nevű karaktert, ami a Ctrl+Q kombinációval lehet billentyűzetről generálni, vagy ismertebb nevén „X-ON”) az átvitel indítására lehet használni. A két karakter ilyen használata eltért az általánosan használt modellektől, viszont széles körben használhatónak bizonyult, főleg perifériák vezérlésére, ugyanis megtakarított egy kábeleret, és ezzel költséget lehetett csökkenteni.

Vegyes[szerkesztés]

A legtöbb ASCII-vezérlőkarakterre azért volt szükség, hogy bizonyos berendezések vagy eljárások vezérlésére lehetőség legyen, de ezek a berendezések és eljárások napjainkban egyre kevesebben vannak, vagy már el is tűntek a napi gyakorlatból. Például a 22-es kód, amit a szinkron modemek küldtek eredetileg, ma gyakorlatilag nem szükséges (egyre kevesebb a szinkron modem; más adatátviteli eljárások vannak használatban). A modern adatátviteli eljárások már bitorientáltak, szemben a régebbi karakterorientált eljárásokkal, ahol vezérlőkaraktereket használtak, míg ma vezérlőbitek, bitszekvenciák végzik a vezérlést.

A 0-s kód, a nullkarakter, speciális eset. A lyukszalagon azt jelentette, hogy nincsen lyukasztás, csak a továbbító lyuk. Ezért is nevezik „kitöltő” karakternek: egyéb jelentése, használata szinte nincs is. Bizonyos fordítóprogramok használják stringek végének jelzésére.

A 127-es kód szintén különleges eset. A „minden bit 1-ben” kód (binárisan) szolgált a lyukszalagon egy karakter törlésére – gyakran ezt kézi lyukasztóval végezték. A lyukszalag volt az egyik legtöbbet használt adathordozó, amikor az ASCII-kódot kidolgozták, de ha visszagondolunk a második világháborúban használt kódfejtő berendezésekre, ahol szintén lyukszalag volt az adathordozó, akkor szinte már történelmi távlatokra tekinthet vissza a lyukszalag. Ma viszont csak múzeumokban lelhető fel… Egyes rendszerek (például az eredeti Apple) a 127-es kódot visszalépésre konvertálták.

Mivel ezt a karaktert ma szinte semmire sem használják, viszont a nyomtatható karakterek közül egy értékes helyet elvesz, mert semmilyen glifa nincsen hozzárendelve, néhány számítógépgyártó elkezdte nyomtatható karakternek használni (többnyire a teljesen fekete „doboz” karaktert rendelték hozzá), amit vagy törölni kívánt karakter átütésére (és így teljes törlésére), vagy grafikai megjelenítésre használtak. A 32 vezérlőkarakter közül ma nagyjából négyet-hatot használnak eredeti funkciójuknak megfelelően a korszerű alkalmazások: „kocsi-vissza”, „soremelés”, „tab”, „escape”, „visszalépés”. A legtöbb fájlrendszer nem engedi meg vezérlőkarakterek használatát a fájlnevekben, mivel ezeknek egyéb fenntartott funkcióik lehetnek.

További információk[szerkesztés]