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

Innen: HamWiki
Ugrás a navigációhoz Ugrás a kereséshez
a (HIGHLIGHTSYNTAX helyett <source lang="...">)
 
(22 közbenső módosítás, amit 3 másik szerkesztő végzett, nincs mutatva)
1. sor: 1. sor:
Napjainkban a betüket, számokat egyre inkább szeretnénk saját nyelvünkön, ékezetesen látni. Sőt az utóbbi évtizedben az is igényként merült fel, hogy egyazon szöveges állomány több nyelv betűit is tartalmazhassa. Ezért érdekes kérdés a karakterkódolások összehasonlítása.
+
Napjainkban a betüket, számokat egyre inkább saját nyelvünkön, ékezetesen írva akarjuk látni. Sőt az utóbbi évtizedben az is igényként merült fel, hogy egyazon szöveges állomány több nyelv betűit is tartalmazhassa. Az egyanazon szövegben bármely nyelv vegyes alkalmazására csak a Unicode illetve az azt optimálisabban kódoló UTF-8 alapú rendszerek képesek. Ezért globalizálódó világunkban a jövő az UTF-8 kódolással átvitt Unicode karakterkészleté.
  
Az ugyanazon szövegben bármely nyelv alkalmazására csak a Unicode illetve az azt kódoló UTF-8 alapú rendszerek képesek.
+
== ASCII karakterek ==
  
== ASCII karakterek ==
+
Az alábbi részekben a karakterkódolási technikák lényegesebb mérföldkövei lesznek összefoglalva, megemlítve, hogy a régi szoftverek használata és azokkal való kompatibilitás miatt az alábbiak mindegyike használatban van még napjainkban.
  
 
[[Kép:ASCII.png|thumb|Szabványos ASCII karakterei]]
 
[[Kép:ASCII.png|thumb|Szabványos ASCII karakterei]]
14. sor: 14. sor:
 
* Kisbetű, számok, minimalizált - írógépes világból származó - írásjelek.
 
* Kisbetű, számok, minimalizált - írógépes világból származó - írásjelek.
 
* Csak angol nyelvterület igényeit elégíti ki.
 
* Csak angol nyelvterület igényeit elégíti ki.
 +
 +
== &#8222;Repülőékezet&#8221; ==
 +
 +
Mivel a kezdeti időkben nem volt ékezetes írásra szabványos lehetőség (7 bites ASCII rendszerek), ezért ki kellett találni valamit az ékezetek továbbítására. Először a TAAVIRATOZAASBAN elterjedt kódolással próbálkoztak. Hamar kiderült, hogy ennél a módszernél jobban olvasható a REPU:LO" E'KEZETES (aposztrófos) írás. A repülőékezet mind a beviteli eszköz (billentyűzet) hiányosságai, a megjelenítő eszköz (monitor) illetve a nyomtató hiányossága miatt egyaránt fontos volt. Továbbá az Internet hajnalán a levéltovábbításnál nem volt lehetőség illetve a rádióamatőr csomagrádió esetén még ma sincs lehetőség, csak szabványos ASCII karakterek továbbítására. Legalábbis ha azt akartuk, hogy a túloldalon levő felhasználó biztosan el tudja olvasni. Ezért az alábbi repüőékezetes kódolással a mai napig találkozhatunk:
 +
 +
{| border="1" style="text-align: center" cellpadding="5px"
 +
! &#8222;Repülő ékezet&#8221;
 +
| a'|| a: néha a~|| e'|| i'|| o'|| o: néha o~|| o"|| u'|| u: néha u~|| u"
 +
|-
 +
! Ábrázolt betű
 +
| á || ä || é || í || ó || ö || ő || ú || ü || ű
 +
|}
 +
 +
Példamondat: Minden hiba's sor egy korso' so:r.
 +
 +
Néhány szoftver ékezetes karakter beviteli megoldása:
 +
 +
* A csomagrádió üzemmódhoz készült '''DigiCom 6''' (DC6) programban is használhattunk ékezetes karaktereket. Ez szintén repülőékezettel történt. Az ä, ö, ü karaktereket a ritkábban használt ~ karakteres módszerrel hozta elő.
 +
* A [http://www.latex-project.org/ LaTeX] szövegformázó (wordprocessor) rendszer pedig előrehozva szereti az aposztrófokat, ráadásul a C nyelvből ismert \ &#8222;escape&#8221; szekvenciával, azonban az ő és ű betűket \H -val jelzi \" helyett, mivel ez utóbbit a hullámos ékezetű betűkre tartogatja: <nowiki>\'Arv\'izt\H ur\H o t\"uk\"orf\'ur\'o\g\'ep</nowiki>. Az ''inputenc'' csomag használatával azonban a valós cp852, iso8859-2 illetve utf8 kódolású karaktereket automatikusan fordítja, tehát ezen csomag felhasználásakor a felhasználó nem szembesül a fent leírtakkal.
 +
* [http://www.vim.org VIM] szövegszerkeztő (texteditor) ''digraph'' mód bekapcsolásával (:set digraph) az alábbiak szerint kezeli az ékezetet: leírjuk az alapbetűt, például az ''e''-t, majd visszatöröljük (backspace) és leütjük a '-t. Ekkor é-t kapunk. A fenti táblázat szerint, az ä, ö, ü kettősponttal. Továbbá a német ß-t például s<visszatörlés>s paranccsal hozhatjuk elő. Az összes így előhozható karakterről a '':dig'' parancs tájékoztat.
 +
 +
== Kiterjesztett karakterkészlet - kódlapok használatával ==
  
 
[[Kép:ASCII-kiterjesztett.png|thumb|Kiterjesztett karakterkészlet]]
 
[[Kép:ASCII-kiterjesztett.png|thumb|Kiterjesztett karakterkészlet]]
  
 
A kiterjesztett karakterkészlet a 8 bites számítástechnika kínálta 1 bitnyi lehetőség kihasználása volt. Segítségével az adott nyelv karakterei ábrázolhatóvá váltak. Később minden nyelv saját kódlapot alakított ki. Ilyen volt magyar nyelvre a CP852.
 
A kiterjesztett karakterkészlet a 8 bites számítástechnika kínálta 1 bitnyi lehetőség kihasználása volt. Segítségével az adott nyelv karakterei ábrázolhatóvá váltak. Később minden nyelv saját kódlapot alakított ki. Ilyen volt magyar nyelvre a CP852.
 +
 +
{| border="1" align="center"
 +
| '''Kódolás''' || '''Nyelvi környezet
 +
|-
 +
| cp437 || USA, Kanada
 +
|-
 +
| cp737 || Görög
 +
|-
 +
| cp775 || Baltic Rim
 +
|-
 +
| cp850 || Európa (nyugat)
 +
|-
 +
| cp852 || Közép/Kelet-Európa, '''magyar'''
 +
|-
 +
| cp855 || Cirill
 +
|-
 +
| cp857 || Török
 +
|-
 +
| cp860 || Portugál
 +
|-
 +
| cp861 || Izland
 +
|-
 +
| cp862 || Héber
 +
|-
 +
| cp863 || Kanadai francia
 +
|-
 +
| cp864 || Arab
 +
|-
 +
| cp865 || Norvég, dán
 +
|-
 +
| cp866 || Cirill/orosz
 +
|-
 +
| cp869 || Görög
 +
|-
 +
| cp936 || Egyszerűsített kínai
 +
|-
 +
| cp949 || Kóreai
 +
|-
 +
| cp874 || Thai
 +
|-
 +
| cp1255|| Héber
 +
|-
 +
| Windows CP1250 || Szláv/közép-európai nyelvekre
 +
|-
 +
| Windows CP1251 || Bolgár, belorusz
 +
|}
 +
  
 
Az ábrán az alapértelmezett amerikai kibővített karakterkészlet látható.
 
Az ábrán az alapértelmezett amerikai kibővített karakterkészlet látható.
26. sor: 95. sor:
  
 
Így az ISO-8859 karakterkészlet alvariánsokra szakadt. Magyar nyelvre az ISO-8859-2 alvariáns felel meg.
 
Így az ISO-8859 karakterkészlet alvariánsokra szakadt. Magyar nyelvre az ISO-8859-2 alvariáns felel meg.
 +
 +
{| border="1" align="center"
 +
| colspan="2" align="center" | '''Kódolás''' || '''Megjegyzés'''
 +
|-
 +
| ISO 8859-1 || Latin 1 || Nyugat-Európa
 +
|-
 +
| ISO 8859-2 || Latin 2 || Szláv/Közép-Európa, '''magyar'''
 +
|-
 +
| ISO 8859-3 || Latin 3 || Eszperantó, Galician, máltai, török
 +
|-
 +
| ISO 8859-4 || Latin 4 || old Baltic
 +
|-
 +
| ISO 8859-5 || Cyrill
 +
|-
 +
| ISO 8859-6 || Arab
 +
|-
 +
| ISO 8859-7 || Modern görög
 +
|-
 +
| ISO 8859-8 || Héber
 +
|-
 +
| ISO 8859-9 || Latin 5 || török
 +
|-
 +
| ISO 8859-13 || Latin 7 || Baltic
 +
|-
 +
| ISO 8859-14 || Latin 8 || Celtic
 +
|-
 +
| ISO 8859-15 || Latin 9 || Nyugat-európai az Euro szimbólummal
 +
|}
  
 
== Unicode és az UTF-8 ==
 
== Unicode és az UTF-8 ==
  
A Unicode az ASCII 7 bites, illetve az ISO-8859-x adott nyelvre adoptált újabb 128 karaktere helyett 16 biten ábrázolja a karakterkészletet. Ez azt jelenti, hogy az ASCII 128 (0..127) karaktere további 65408 betűvel lett kiegészítve.
+
Az internet előretörésével egyre erősebb lett arra az igény, hogy a fenti sok-sok karakterkódolás helyett egyetlen univerzális karakterkódolást alkalmazzanak, amit minden szoftver ugyanúgy képes kezelni. Azaz például egy magyar &#8222;árvíztűrő&#8221; szót egy Kínában használt levelezőszoftver vagy egyéb szoftver képes legyen ugyanígy megjeleníteni, illetve a nálunk használt szoftverek is a kínai karaktereket. Az ''universal character encoding'' kifejezésből képzett mozaikszóval, unicode-nak nevezték el ezt a karakter ábrázolást. Az unicode múltja 1987-re tekint vissza, és 1992 júniusában jelent meg az 1.0-ás verziója.
 +
 
 +
A Unicode az ASCII 7 bites, illetve az ISO-8859-x adott nyelvre adoptált újabb 128 karaktere helyett 16 biten ábrázolja a karakterkészletet. Ez azt jelenti, hogy az ASCII 128 (0..127) karaktere további 65408 betűvel lett kiegészítve. Így lehetővé vált a bolygónk összes nyelvének a betűit úgy kódolni, hogy akár egyetlen szöveges (text) állományban is továbbíthassuk.
  
 
A unicode karakterek a karakter képével együtt a http://www.unicode.org/charts/ oldalon található meg.
 
A unicode karakterek a karakter képével együtt a http://www.unicode.org/charts/ oldalon található meg.
 +
 +
Az Unicode hátránya, hogy 2 byte-ot használ fel egyetlen karakter ábrázolására, ami miatt egy újabb trükkel való ötvözése kellett az elterjedéséhez.
 +
 +
''Megjegyzés:'' HTML szövegformázó nyelvben például karakterkódolástól függetlenül az &amp;#SZÁM; szintaktikával tetszóleges Unicode karakter beilleszthető.
  
 
== Az UTF-8 kódolás ==
 
== Az UTF-8 kódolás ==
  
Kepzeljük el azt az esetet, hogy 8-nál több bitet szeretnénk átvinni, azonban nem szeretnénk okvetlen 16 bites számot felhasználni. Ezt megtehetjük úgy is, hogy egy 8 bites szám felső 1-es bitjeinek száma a legelső 0-ig azt mutatja, hogy van még utána az egyesek számának megfelelő byte, ami ugyanennek a sok bites értéknek a bitjeit adja.
+
Az UTF-8 története 1992 szeptemberére nyúlik vissza. Ekkor lett először alkalmazva a ''Plan 9'' operációs rendszerben, majd 1993 januárjában lett szélesebb körben ismertetve.
  
Alább az x-ek jelzik az összerakható biteket, a többi a fix értékű biteket. Ezek szerint:
+
Az UTF-8 a ''8-bit Unicode Transformation Format'' (8 bites Unicode átalakítási formátum). Feladata, hogy az előzőekben ismertetett 16 bites Unicode karakterkészletet változó hosszúságban átvigye, azaz csak akkor használjon több byte-os kódot, ha olyan karaktert kívánunk átvinni, amely az ASCII kódtáblában nem szerepel.
  
{| border="1" style="text-align: center"
+
Képzeljük el azt az esetet, hogy 8-nál több bitet szeretnénk átvinni, azonban nem szeretnénk okvetlen 16 bites számot felhasználni. Erre egy lehetőség, hogy amikor a 0x7F-nél nagyobb értéket szeretnénk átvinni, akkor 110x xxxx bináris előtagot teszünk elé, ahogy az alábbi táblázat mutatja. Az x-ek a tetszőleges állapotú karakter leíró bitek.
| '''Byte-ok száma:''' || 7 byte || 6 byte || 5 byte || 4 byte || 3 byte || 2 byte || 1 byte
+
 
 +
{| style="background-color: #f0f0f0"
 +
! Unicode karakter érték<br>(hexadecimális) || UTF-8 érték<br>(bináris) || Megjegyzés
 
|-
 
|-
| '''Bitenkénti kinézete:'''|| 1111 110x || 1111 10xx || 1111 0xxx || 1110 xxxx || 110x xxxx || 10xx xxxx || 0xxx xxxx
+
| 0000 - 007F || 0xxx xxxx || 1 byte-al 7 bites ASCII
 
|-
 
|-
| '''Ennyi bit többletet ad:''' || 1 || 2 || 3 || 4 || 5 || 6 || 7
+
| 0080 - 07FF || 110x xxxx 10xx xxxx || 2 byte-al 11 bites karakterkód
 
|-
 
|-
| '''Összes hasznos bit:''' || 28 || 27 || 25 || 22 || 18 || 13 || 7
+
| 0800 - FFFF || 1110 xxxx 10xx xxxx 10xx xxxx || 3 byte-al 16 bies karakterkód
 +
|-
 +
| 1 0000 - 1F FFFF || 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx|| 4 byte-al 21 bites karakterkód
 
|}
 
|}
  
A gyakorlatban a 16 bites Unicodot választották a karakter elrendezés alapjának, amely 65536 különböző karakter megjelenítésére képes az ASCII szabvanyos 128 (0...0x7F) illetve az ISO8859-2 256 karakterével szemben.
+
A gyakorlatban a mára már 20 bitessé duzzadt Unicodot választották a karakter elrendezés alapjának, amely 65536 különböző karakter megjelenítésére képes az ASCII szabvanyos 128 (0...0x7F) illetve az ISO8859-2 256 karakterével szemben.
 +
 
 +
Ez azt is jelenti, hogy a 7 bites (0..0x7F) ASCII átviteléhez továbbra is elegendő az 1 byte-os 0xxx xxxx forma. Ez alapvető tervezési szempont volt. Azonban ha 127 feletti értéket szeretnénk átvinni, pontosabban a 128 és 2047 (0x80..0x07FF) közöttit, akkor ezt 2 byte felhasználásával tudjuk megtenni.
 +
 
 +
2048-65535-ig (0x0800-0xFFFF) pedig 3 byte-ba kódolt karakterek következnek. Érdekességképp ilyen 3 byte-os a magyar also 99 ( &#8222; ) és a felso 99 ( &#8221; ) alakú idezőjel is. A Unicode táblában a 8222 illetve 8221 számértéket viseli. Mindeközben a számítástechnikai macskaköröm ( " ) mindössze 1 byte-os, mert az eredeti ASCII kódkészlet tartozéka.
  
Ez azt is jelenti, hogy a 7 bites (0..0x7F) ASCII átviteléhez továbbra is elegendő az 1 byte-os 0xxx xxxx forma. Ez alapvető tervezési szempont volt. Azonban ha 127 feletti értéket szeretnénk átvinni, pontosabban a 128 és 8191 (0x80..0x1FFF) közöttit, akkor ezt 2 byte felhasználásával tudjuk megtenni.
+
Ne felejtsük el, hogy a statisztika szerint a legtöbbet az angol ABC betűit használjuk, és csak sokkal ritkábban használjuk a több byte-ot foglaló ékezeteket illetve speciális karaktereket. Ezáltal végeredményként byte-okat spórolunk meg az átvitt illetve tárolt szövegben, miközben bármely nyelv karakterkészletéből lehetőségünk nyílik karaktert beilleszteni a szövegbe.
  
Ugyanis ekkor az információ az alábbiak szerint helyezkedik el:
+
És végül egy UTF8 - Unicode konverter függvény:
  
{|
+
<source lang="c">#include <wchar.h>
! Felső byte !! Alsó byte
+
 
 +
int unicode_to_utf8(wchar_t wc, unsigned char *utf8) { // return: hany byte-os, -1: error
 +
    int bytes, i;
 +
    if (wc < 0x80) {          // ASCII
 +
        bytes=1;
 +
        utf8[0]=wc;
 +
    } else if (wc < 0x800) {  // UTF8
 +
        bytes=2;
 +
        utf8[0]=0xc0+(wc>>6);  // 0x110x xxxx
 +
    } else if (wc < 0x10000) {
 +
        bytes=3;
 +
        utf8[0]=0xe0+(wc>>12); // 0x1110 xxxx
 +
    } else if (wc < 0x200000) {
 +
        bytes=4;
 +
        utf8[0]=0xf0+(wc>>18); // 0x1111 0xxx
 +
    } else bytes=-1; // error
 +
    i=bytes;
 +
    if (i > 1) utf8[--i]=0x80+(wc&0x3f);      // 10xx xxxx adatblokkok
 +
    if (i > 1) utf8[--i]=0x80+((wc&0x0fff)>>6);
 +
    if (i > 1) utf8[--i]=0x80+((wc&0x3ffff)>>12);
 +
    return bytes;
 +
}
 +
 
 +
int utf8_to_unicode(unsigned char *utf8, wchar_t *wc) { // return: hany byte-os? -1: error;
 +
    int bytes, i;
 +
    if (utf8[0] < 0x80) {                  // ASCII
 +
        bytes=1;
 +
        *wc=utf8[0];
 +
    } else if ((utf8[0] & 0xe0) == 0xc0) { // 0x110x xxxx
 +
        bytes=2;
 +
        *wc=utf8[0]&0x1f;
 +
    } else if ((utf8[0] & 0xf0) == 0xe0) { // 0x1110 xxxx
 +
        bytes=3;
 +
        *wc=utf8[0]&0x0f;
 +
    } else if ((utf8[0] & 0xf8) == 0xf0) { // 0x1111 0xxx
 +
        bytes=4;
 +
        *wc=utf8[0]&0x07;
 +
    }
 +
    for (i=1; i<bytes; i++) {
 +
        if ((utf8[i] & 0xc0) != 0x80) bytes=-1; // A tobbi byte-nak 10xx xxxx alakunak kell lennie
 +
        else *wc=(*wc<<6)+(utf8[i]&0x3f);
 +
    }
 +
    return bytes;
 +
}
 +
</source>
 +
 
 +
== Az UTF-8 felhasználása ==
 +
 
 +
Az UTF-8 előnyös tulajdonsága miatt a jövőben várhatólag mindenhol UTF-8 kódolással fogunk találkozni. Ezáltal a klasszikus TXT fájl is UTF-8 alapú lesz, a fájlnevek is UTF-8 alapon lesznek kódolva, továbbá a terminálkapcsolatok esetén is az UTF-8 karakterkódolás fogja biztosítani, hogy bármely nyelvű szimbólum átvihető, megjeleníthető legyen.
 +
 
 +
Napjainkban a Unix rendszerek egyre inkább UTF-8 kódolásra térnek át, a Microsoft Windows-XP -től felfelé is az UTF-8 előretörése figyelhető meg. Ezért gyakorlatilag ISO-8859-2 -ben már hosszabb távon nem érdemes gondolkodni.
 +
 
 +
== Karakterkódolások közötti konverzió ==
 +
 
 +
ISO-8859-2 -es terminálon UTF-8 karakterek (és fordítva) az ékezetes karakterek helyett ákom-bákom jelenik meg. A POSIX rendszereknél (Linux, BSD, Solaris, stb.) az ''iconv'' nevű programmal konvertálhatunk a leg egyszerűbben. Egy példa állománynevek ISO-8859-2 -ről UTF-8-ba konvertálásra:
 +
 
 +
<source lang="bash">for i in *.jpg; do uj=`echo "$i" | iconv -f iso8859-2 -t utf-8`; mv "$i" "$uj"; done</source>
 +
 
 +
Illetve egy másik, amikor nem az állomány nevét, hanem a tartalmát szeretnénk iso8859-2 -ről utf-8-ba konvertálni például Linux alatt:
 +
 
 +
<source lang="bash">for i in *.txt; do iconv -f iso8859-2 -t utf-8 < "$i" > "$i.tmp"; mv "$i.tmp" "$i"; done</source>
 +
 
 +
POSIX rendszerek esetén a terminál átkapcsolása UTF-8 kódolásról például ISO8859-2-re: LC_CTYPE környezeti változó értékét változtassuk át hu_HU.utf8 -ról hu_HU-ra. Például xterm indításához:
 +
 
 +
<source lang="bash">LC_CTYPE=hu_HU xterm</source>
 +
 
 +
És az így elindított xterm ISO8859-2 karakterkódolással és annak korlátaival fog rendelkezni, ezáltal a visszafelé kompatibilis biztosítható, amely a régi vagy Windows alól szerkesztett szövegállományokhoz jöhet jól, amit még onnan is akarnak olvasni.
 +
 
 +
== Tesztszövegek magyar ékezetes betűk ellenőrzéséhez ==
 +
 
 +
Alább olyan szövegeket olvashatunk, amely minden magyar ékezetes betűt tartalmaz:
 +
 
 +
{| border="1" align="center"
 +
!Kisbetűvel || Nagybetűvel
 +
|-
 +
|árvíztűrő tükörfúrógép || ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP 
 +
|-
 +
|különc művésztől túlzó írás || KÜLÖNC MŰVÉSZTŐL TÚLZÓ ÍRÁS 
 +
|-
 +
|lányért síró önző nyúlfülű || LÁNYÉRT SÍRÓ ÖNZŐ NYÚLFÜLŰ 
 
|-
 
|-
| 10xx xxxx || 0xxx xxxx
+
| tüskéshátú kígyóbűvölő || TÜSKÉSHÁTÚ KÍGYÓBŰVÖLŐ 
 
|}
 
|}
  
A fenti ábrában az x-ek a hasznos bitek.
 
  
8192-65535-ig (0x1FFF-0xFFFF) pedig 3 byte-ba kódolt karakterek következnek. Érdekességképp ilyen 3 byte-os a magyar also 99 ( &#8222; ) és a felso 99 ( &#8221; ) alakú idezőjel is. A Unicode táblában a 8222 illetve 8221 számértéket viseli. Mindeközben a számítástechnikai macskaköröm ( " ) mindössze 1 byte-os, mert az eredeti ASCII kódkészlet tartozéka.
+
[[Kategória:Rádióamatőr adatátvitel]]

A lap jelenlegi, 2009. február 9., 03:28-kori változata

Napjainkban a betüket, számokat egyre inkább saját nyelvünkön, ékezetesen írva akarjuk látni. Sőt az utóbbi évtizedben az is igényként merült fel, hogy egyazon szöveges állomány több nyelv betűit is tartalmazhassa. Az egyanazon szövegben bármely nyelv vegyes alkalmazására csak a Unicode illetve az azt optimálisabban kódoló UTF-8 alapú rendszerek képesek. Ezért globalizálódó világunkban a jövő az UTF-8 kódolással átvitt Unicode karakterkészleté.

ASCII karakterek

Az alábbi részekben a karakterkódolási technikák lényegesebb mérföldkövei lesznek összefoglalva, megemlítve, hogy a régi szoftverek használata és azokkal való kompatibilitás miatt az alábbiak mindegyike használatban van még napjainkban.

Szabványos ASCII karakterei

Az ASCII az American Standard Code for Information Interchange (Amerikai szabvány kód az információcseréhez) talán a leg ismertebb karakter kódolás, a mai számítástechnikának az alapja.

Jellemzői:

  • Első negyede terminál vezérlő karakterekből áll. Lásd bekeretezett részt. Ilyen például a TAB (tabulátor) vagy CR (kocsivissza) és LF (újsor). Érdekes, hogy a Microsoft cég a sorvéget CRLF-el jelölte, a Unixok esetén az LF, mint sor vége terjedt el. Terminál esetén az ENTER gomb CR jelet küld.
  • 16-os számrendszerben szisztematikus felépítésű
  • Kisbetű, számok, minimalizált - írógépes világból származó - írásjelek.
  • Csak angol nyelvterület igényeit elégíti ki.

„Repülőékezet”

Mivel a kezdeti időkben nem volt ékezetes írásra szabványos lehetőség (7 bites ASCII rendszerek), ezért ki kellett találni valamit az ékezetek továbbítására. Először a TAAVIRATOZAASBAN elterjedt kódolással próbálkoztak. Hamar kiderült, hogy ennél a módszernél jobban olvasható a REPU:LO" E'KEZETES (aposztrófos) írás. A repülőékezet mind a beviteli eszköz (billentyűzet) hiányosságai, a megjelenítő eszköz (monitor) illetve a nyomtató hiányossága miatt egyaránt fontos volt. Továbbá az Internet hajnalán a levéltovábbításnál nem volt lehetőség illetve a rádióamatőr csomagrádió esetén még ma sincs lehetőség, csak szabványos ASCII karakterek továbbítására. Legalábbis ha azt akartuk, hogy a túloldalon levő felhasználó biztosan el tudja olvasni. Ezért az alábbi repüőékezetes kódolással a mai napig találkozhatunk:

„Repülő ékezet” a' a: néha a~ e' i' o' o: néha o~ o" u' u: néha u~ u"
Ábrázolt betű á ä é í ó ö ő ú ü ű

Példamondat: Minden hiba's sor egy korso' so:r.

Néhány szoftver ékezetes karakter beviteli megoldása:

  • A csomagrádió üzemmódhoz készült DigiCom 6 (DC6) programban is használhattunk ékezetes karaktereket. Ez szintén repülőékezettel történt. Az ä, ö, ü karaktereket a ritkábban használt ~ karakteres módszerrel hozta elő.
  • A LaTeX szövegformázó (wordprocessor) rendszer pedig előrehozva szereti az aposztrófokat, ráadásul a C nyelvből ismert \ „escape” szekvenciával, azonban az ő és ű betűket \H -val jelzi \" helyett, mivel ez utóbbit a hullámos ékezetű betűkre tartogatja: \'Arv\'izt\H ur\H o t\"uk\"orf\'ur\'o\g\'ep. Az inputenc csomag használatával azonban a valós cp852, iso8859-2 illetve utf8 kódolású karaktereket automatikusan fordítja, tehát ezen csomag felhasználásakor a felhasználó nem szembesül a fent leírtakkal.
  • VIM szövegszerkeztő (texteditor) digraph mód bekapcsolásával (:set digraph) az alábbiak szerint kezeli az ékezetet: leírjuk az alapbetűt, például az e-t, majd visszatöröljük (backspace) és leütjük a '-t. Ekkor é-t kapunk. A fenti táblázat szerint, az ä, ö, ü kettősponttal. Továbbá a német ß-t például s<visszatörlés>s paranccsal hozhatjuk elő. Az összes így előhozható karakterről a :dig parancs tájékoztat.

Kiterjesztett karakterkészlet - kódlapok használatával

Kiterjesztett karakterkészlet

A kiterjesztett karakterkészlet a 8 bites számítástechnika kínálta 1 bitnyi lehetőség kihasználása volt. Segítségével az adott nyelv karakterei ábrázolhatóvá váltak. Később minden nyelv saját kódlapot alakított ki. Ilyen volt magyar nyelvre a CP852.

Kódolás Nyelvi környezet
cp437 USA, Kanada
cp737 Görög
cp775 Baltic Rim
cp850 Európa (nyugat)
cp852 Közép/Kelet-Európa, magyar
cp855 Cirill
cp857 Török
cp860 Portugál
cp861 Izland
cp862 Héber
cp863 Kanadai francia
cp864 Arab
cp865 Norvég, dán
cp866 Cirill/orosz
cp869 Görög
cp936 Egyszerűsített kínai
cp949 Kóreai
cp874 Thai
cp1255 Héber
Windows CP1250 Szláv/közép-európai nyelvekre
Windows CP1251 Bolgár, belorusz


Az ábrán az alapértelmezett amerikai kibővített karakterkészlet látható.

ISO-8859-x család

A következő komoly mérföldkő az ISO-8859-x karakter kódolás család, amelyben szabványosították a 128-255 közé eső karaktereket. Első körben Nyugat-Európára, majd rá kellett döbbenni, hogy a kelet-közép-európai tagállamoknak vannak még érdekes karakterei.

Így az ISO-8859 karakterkészlet alvariánsokra szakadt. Magyar nyelvre az ISO-8859-2 alvariáns felel meg.

Kódolás Megjegyzés
ISO 8859-1 Latin 1 Nyugat-Európa
ISO 8859-2 Latin 2 Szláv/Közép-Európa, magyar
ISO 8859-3 Latin 3 Eszperantó, Galician, máltai, török
ISO 8859-4 Latin 4 old Baltic
ISO 8859-5 Cyrill
ISO 8859-6 Arab
ISO 8859-7 Modern görög
ISO 8859-8 Héber
ISO 8859-9 Latin 5 török
ISO 8859-13 Latin 7 Baltic
ISO 8859-14 Latin 8 Celtic
ISO 8859-15 Latin 9 Nyugat-európai az Euro szimbólummal

Unicode és az UTF-8

Az internet előretörésével egyre erősebb lett arra az igény, hogy a fenti sok-sok karakterkódolás helyett egyetlen univerzális karakterkódolást alkalmazzanak, amit minden szoftver ugyanúgy képes kezelni. Azaz például egy magyar „árvíztűrő” szót egy Kínában használt levelezőszoftver vagy egyéb szoftver képes legyen ugyanígy megjeleníteni, illetve a nálunk használt szoftverek is a kínai karaktereket. Az universal character encoding kifejezésből képzett mozaikszóval, unicode-nak nevezték el ezt a karakter ábrázolást. Az unicode múltja 1987-re tekint vissza, és 1992 júniusában jelent meg az 1.0-ás verziója.

A Unicode az ASCII 7 bites, illetve az ISO-8859-x adott nyelvre adoptált újabb 128 karaktere helyett 16 biten ábrázolja a karakterkészletet. Ez azt jelenti, hogy az ASCII 128 (0..127) karaktere további 65408 betűvel lett kiegészítve. Így lehetővé vált a bolygónk összes nyelvének a betűit úgy kódolni, hogy akár egyetlen szöveges (text) állományban is továbbíthassuk.

A unicode karakterek a karakter képével együtt a http://www.unicode.org/charts/ oldalon található meg.

Az Unicode hátránya, hogy 2 byte-ot használ fel egyetlen karakter ábrázolására, ami miatt egy újabb trükkel való ötvözése kellett az elterjedéséhez.

Megjegyzés: HTML szövegformázó nyelvben például karakterkódolástól függetlenül az &#SZÁM; szintaktikával tetszóleges Unicode karakter beilleszthető.

Az UTF-8 kódolás

Az UTF-8 története 1992 szeptemberére nyúlik vissza. Ekkor lett először alkalmazva a Plan 9 operációs rendszerben, majd 1993 januárjában lett szélesebb körben ismertetve.

Az UTF-8 a 8-bit Unicode Transformation Format (8 bites Unicode átalakítási formátum). Feladata, hogy az előzőekben ismertetett 16 bites Unicode karakterkészletet változó hosszúságban átvigye, azaz csak akkor használjon több byte-os kódot, ha olyan karaktert kívánunk átvinni, amely az ASCII kódtáblában nem szerepel.

Képzeljük el azt az esetet, hogy 8-nál több bitet szeretnénk átvinni, azonban nem szeretnénk okvetlen 16 bites számot felhasználni. Erre egy lehetőség, hogy amikor a 0x7F-nél nagyobb értéket szeretnénk átvinni, akkor 110x xxxx bináris előtagot teszünk elé, ahogy az alábbi táblázat mutatja. Az x-ek a tetszőleges állapotú karakter leíró bitek.

Unicode karakter érték
(hexadecimális)
UTF-8 érték
(bináris)
Megjegyzés
0000 - 007F 0xxx xxxx 1 byte-al 7 bites ASCII
0080 - 07FF 110x xxxx 10xx xxxx 2 byte-al 11 bites karakterkód
0800 - FFFF 1110 xxxx 10xx xxxx 10xx xxxx 3 byte-al 16 bies karakterkód
1 0000 - 1F FFFF 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx 4 byte-al 21 bites karakterkód

A gyakorlatban a mára már 20 bitessé duzzadt Unicodot választották a karakter elrendezés alapjának, amely 65536 különböző karakter megjelenítésére képes az ASCII szabvanyos 128 (0...0x7F) illetve az ISO8859-2 256 karakterével szemben.

Ez azt is jelenti, hogy a 7 bites (0..0x7F) ASCII átviteléhez továbbra is elegendő az 1 byte-os 0xxx xxxx forma. Ez alapvető tervezési szempont volt. Azonban ha 127 feletti értéket szeretnénk átvinni, pontosabban a 128 és 2047 (0x80..0x07FF) közöttit, akkor ezt 2 byte felhasználásával tudjuk megtenni.

2048-65535-ig (0x0800-0xFFFF) pedig 3 byte-ba kódolt karakterek következnek. Érdekességképp ilyen 3 byte-os a magyar also 99 ( „ ) és a felso 99 ( ” ) alakú idezőjel is. A Unicode táblában a 8222 illetve 8221 számértéket viseli. Mindeközben a számítástechnikai macskaköröm ( " ) mindössze 1 byte-os, mert az eredeti ASCII kódkészlet tartozéka.

Ne felejtsük el, hogy a statisztika szerint a legtöbbet az angol ABC betűit használjuk, és csak sokkal ritkábban használjuk a több byte-ot foglaló ékezeteket illetve speciális karaktereket. Ezáltal végeredményként byte-okat spórolunk meg az átvitt illetve tárolt szövegben, miközben bármely nyelv karakterkészletéből lehetőségünk nyílik karaktert beilleszteni a szövegbe.

És végül egy UTF8 - Unicode konverter függvény:

<source lang="c">#include <wchar.h>

int unicode_to_utf8(wchar_t wc, unsigned char *utf8) { // return: hany byte-os, -1: error

   int bytes, i;
   if (wc < 0x80) {           // ASCII
       bytes=1;
       utf8[0]=wc;
   } else if (wc < 0x800) {   // UTF8
       bytes=2;
       utf8[0]=0xc0+(wc>>6);  // 0x110x xxxx
   } else if (wc < 0x10000) {
       bytes=3;
       utf8[0]=0xe0+(wc>>12); // 0x1110 xxxx
   } else if (wc < 0x200000) {
       bytes=4;
       utf8[0]=0xf0+(wc>>18); // 0x1111 0xxx 
   } else bytes=-1; // error
   i=bytes;
   if (i > 1) utf8[--i]=0x80+(wc&0x3f);       // 10xx xxxx adatblokkok
   if (i > 1) utf8[--i]=0x80+((wc&0x0fff)>>6);
   if (i > 1) utf8[--i]=0x80+((wc&0x3ffff)>>12);
   return bytes;

}

int utf8_to_unicode(unsigned char *utf8, wchar_t *wc) { // return: hany byte-os? -1: error;

   int bytes, i;
   if (utf8[0] < 0x80) {                  // ASCII
       bytes=1;
       *wc=utf8[0];
   } else if ((utf8[0] & 0xe0) == 0xc0) { // 0x110x xxxx
       bytes=2;
       *wc=utf8[0]&0x1f;
   } else if ((utf8[0] & 0xf0) == 0xe0) { // 0x1110 xxxx
       bytes=3;
       *wc=utf8[0]&0x0f;
   } else if ((utf8[0] & 0xf8) == 0xf0) { // 0x1111 0xxx 
       bytes=4;
       *wc=utf8[0]&0x07;
   }
   for (i=1; i<bytes; i++) {
       if ((utf8[i] & 0xc0) != 0x80) bytes=-1; // A tobbi byte-nak 10xx xxxx alakunak kell lennie
       else *wc=(*wc<<6)+(utf8[i]&0x3f);
   }
   return bytes;

} </source>

Az UTF-8 felhasználása

Az UTF-8 előnyös tulajdonsága miatt a jövőben várhatólag mindenhol UTF-8 kódolással fogunk találkozni. Ezáltal a klasszikus TXT fájl is UTF-8 alapú lesz, a fájlnevek is UTF-8 alapon lesznek kódolva, továbbá a terminálkapcsolatok esetén is az UTF-8 karakterkódolás fogja biztosítani, hogy bármely nyelvű szimbólum átvihető, megjeleníthető legyen.

Napjainkban a Unix rendszerek egyre inkább UTF-8 kódolásra térnek át, a Microsoft Windows-XP -től felfelé is az UTF-8 előretörése figyelhető meg. Ezért gyakorlatilag ISO-8859-2 -ben már hosszabb távon nem érdemes gondolkodni.

Karakterkódolások közötti konverzió

ISO-8859-2 -es terminálon UTF-8 karakterek (és fordítva) az ékezetes karakterek helyett ákom-bákom jelenik meg. A POSIX rendszereknél (Linux, BSD, Solaris, stb.) az iconv nevű programmal konvertálhatunk a leg egyszerűbben. Egy példa állománynevek ISO-8859-2 -ről UTF-8-ba konvertálásra:

<source lang="bash">for i in *.jpg; do uj=`echo "$i" | iconv -f iso8859-2 -t utf-8`; mv "$i" "$uj"; done</source>

Illetve egy másik, amikor nem az állomány nevét, hanem a tartalmát szeretnénk iso8859-2 -ről utf-8-ba konvertálni például Linux alatt:

<source lang="bash">for i in *.txt; do iconv -f iso8859-2 -t utf-8 < "$i" > "$i.tmp"; mv "$i.tmp" "$i"; done</source>

POSIX rendszerek esetén a terminál átkapcsolása UTF-8 kódolásról például ISO8859-2-re: LC_CTYPE környezeti változó értékét változtassuk át hu_HU.utf8 -ról hu_HU-ra. Például xterm indításához:

<source lang="bash">LC_CTYPE=hu_HU xterm</source>

És az így elindított xterm ISO8859-2 karakterkódolással és annak korlátaival fog rendelkezni, ezáltal a visszafelé kompatibilis biztosítható, amely a régi vagy Windows alól szerkesztett szövegállományokhoz jöhet jól, amit még onnan is akarnak olvasni.

Tesztszövegek magyar ékezetes betűk ellenőrzéséhez

Alább olyan szövegeket olvashatunk, amely minden magyar ékezetes betűt tartalmaz:

Kisbetűvel Nagybetűvel
árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP
különc művésztől túlzó írás KÜLÖNC MŰVÉSZTŐL TÚLZÓ ÍRÁS
lányért síró önző nyúlfülű LÁNYÉRT SÍRÓ ÖNZŐ NYÚLFÜLŰ
tüskéshátú kígyóbűvölő TÜSKÉSHÁTÚ KÍGYÓBŰVÖLŐ