tanszek:oktatas:szamitastechnika:karakterkodolas
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tanszek:oktatas:szamitastechnika:karakterkodolas [2026/09/30 17:40] – [Gyakorlati karakterkódolási problémák] knehez | tanszek:oktatas:szamitastechnika:karakterkodolas [2026/10/01 15:17] (current) – [3. ASCII: egy közösen elfogadott kódtáblázat] knehez | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ===== Karakterkódolás ===== | ===== Karakterkódolás ===== | ||
| - | A számítógép | + | Amikor leírjuk azt, hogy '' |
| - | Mérnöki munkában karakterkódolással találkozhatunk például mérési eredmények exportálásakor, | + | Ebben a fejezetben megvizsgáljuk, hogyan |
| - | ==== Karakter, kódpont és bájt ==== | + | ==== 1. Hogyan lesz a betűből szám? |
| - | A kódolás megértéséhez három fogalmat különböztetünk meg: | + | A szövegben szereplő betűket, számjegyeket, |
| - | ^ Fogalom ^ Jelentés ^ Példa ^ | + | Készítsünk egy nagyon egyszerű, |
| - | | **Karakter** | A szöveg egyik jele. | Az '' | + | |
| - | | **Unicode-kódpont** | A Unicode rendszerében | + | |
| - | | **Kódolt bájtsorozat** | A karakter tárolási alakja egy adott kódolásban. | UTF-8 esetén '' | + | |
| - | A táblázatban a kódpont és a bájtok értékei **hexadecimális**, | + | ^ Betű ^ Hozzárendelt szám ^ |
| + | | A | 1 | | ||
| + | | B | 2 | | ||
| + | | C | 3 | | ||
| - | Egy **bájt 8 bitből áll**, ezért 256 különböző értéket vehet fel. Egy karakter tárolásához azonban nem feltétlenül elegendő egyetlen bájt. | + | Ezzel a táblázattal az '' |
| - | **A karakterek száma és a tároláshoz szükséges bájtok száma nem feltétlenül egyezik meg.** | + | Mi történne, ha a fogadó fél egy másik táblázatot használna, amelyben az 1 a B betűt, a 2 pedig az A betűt jelenti? Ugyanabból az '' |
| - | ==== ASCII és a régi kódlapok ==== | + | **Az adó és a fogadó félnek ugyanazokat a kódolási szabályokat kell használnia.** Ez a valódi szövegfájlok kezelésére is igaz. |
| - | === ASCII === | + | ==== 2. Hogyan tároljuk a hozzárendelt számokat? ==== |
| - | Az **ASCII** (American Standard Code for Information Interchange) egy **7 bites** karakterkód. A 7 bit összesen | + | A számítógép a számokat kettes számrendszerben, |
| - | Az ASCII tartalmazza: | + | Nyolc biten 256 különböző érték különböztethető meg. Ha ezeket előjel nélküli egész számként értelmezzük, |
| - | * az angol ábécé 26 nagybetűjét és 26 kisbetűjét; | + | Az előbbi kitalált példában tároljunk minden betűkódot egy bájton: |
| - | * a tíz számjegyet; | + | |
| - | * írásjeleket és néhány műveleti jelet; | + | |
| - | * a szóközt és a vezérlőkaraktereket. | + | |
| - | A **vezérlőkarakterek** nem megjelenítendő betűket jelölnek. Ilyen például a tabulátor, a soremelés (LF) és a kocsi-vissza (CR). Szövegfájlokban a sor végét egyes rendszerek LF-fel, mások CR és LF egymás utáni használatával jelölik. Ez a különbség nem azonos a karakterkódolások eltérésével. | + | ^ Betű ^ Hozzárendelt szám ^ A szám nyolc biten ^ |
| + | | A | 1 | '' | ||
| + | | B | 2 | '' | ||
| + | | C | 3 | '' | ||
| - | ^ Karakter ^ Decimális ASCII-kód ^ Hexadecimális ASCII-kód ^ | + | Az '' |
| - | | Szóköz | 32 | '' | + | |
| - | | 0 | 48 | '' | + | |
| - | | A | 65 | '' | + | |
| - | | a | 97 | '' | + | |
| - | Az ASCII önmagában nem tartalmazza a magyar ékezetes | + | Ezzel már egy teljes tárolási szabályt adtunk meg: megmondtuk, melyik |
| - | // | + | A **karakterkódolás** meghatározza, hogyan alakítjuk |
| - | === Nyelvfüggő kódlapok === | + | A saját táblázatunk csak szemléltetésre szolgál. A gyakorlatban közösen elfogadott, szabványos kódolásokat használunk, |
| - | Az ékezetes betűk és további jelek tárolásához különböző **8 bites kódlapok** terjedtek el. Ezek egy bájton legfeljebb 256 különböző kódértéket tudnak megkülönböztetni. A következő kódlapok alsó 128 kódértéke az ASCII-val egyezik meg, a további kódértékek jelentése viszont eltérhet. | + | ==== 3. ASCII: |
| - | ^ Kódlap ^ Jellemző felhasználás ^ | + | Az egyik ilyen szabvány az **ASCII**. Teljes neve American Standard Code for Information Interchange. Az ASCII meghatározza, hogy az általa kezelt karakterekhez mely számok tartoznak. |
| - | | IBM CP852 | Régi DOS-os, közép-európai szövegek; a magyar ékezetes betűket is tartalmazza. | | + | |
| - | | Windows-1250 | Régebbi Windowsos, közép-európai szövegek. | | + | |
| - | | ISO-8859-1 (Latin-1) | Elsősorban nyugat-európai nyelvek; | + | |
| - | | ISO-8859-2 (Latin-2) | Közép- és kelet-európai nyelvek; a magyar ékezetes betűket is tartalmazza. | | + | |
| - | **Ezek különböző kódlapok, nem ugyanannak | + | Például a nagy '' |
| - | A programokban előforduló **ANSI** megnevezés nem egyetlen, egyértelműen meghatározott karakterkódolás neve. Windowsos környezetben többféle régi kódlapra is utalhat. Adatcserénél ezért célszerű pontos nevet megadni, például | + | ^ Karakter ^ ASCII-kód tízes számrendszerben ^ Tárolása egy bájton ^ |
| + | | A | 65 | '' | ||
| + | | B | 66 | '' | ||
| + | | a | 97 | '' | ||
| + | | 0 | 48 | '' | ||
| + | | Szóköz | 32 | '' | ||
| - | ==== Unicode: közös karakterkészlet ==== | + | Az '' |
| - | A nyelvenként eltérő kódlapok megnehezítették a többnyelvű szövegek kezelését. A **Unicode** célja, hogy közös rendszerben lehessen azonosítani a különböző írásrendszerek karaktereit, valamint | + | Az ASCII **128 kódértéket** használ, 0-tól 127-ig. Ennyi lehetőséghez 7 bit szükséges, mert 2 a hetediken 128. Ezért mondjuk, hogy az ASCII **7 bites kód**. A gyakorlatban rendszerint egy bájtot használunk egy ASCII-karakter tárolásához; |
| - | A Unicode sok mai és történeti írásrendszer jeleit tartalmazza, | + | === Mi fér bele az ASCII-ba? === |
| - | ^ Karakter ^ Unicode-kódpont ^ Jelentés ^ | + | Az ASCII tartalmazza az angol ábécé nagy- és kisbetűit, a számjegyeket, |
| - | | A | '' | + | |
| - | | ó | '' | + | |
| - | | ő | '' | + | |
| - | | ° | '' | + | |
| - | | Ω | '' | + | |
| - | | € | '' | + | |
| - | A Unicode első 128 kódpontja, az '' | + | A magyar ékezetes betűk viszont nem szerepelnek benne. Az '' |
| - | **A kódpont azonosítja a karaktert, de önmagában nem mondja meg, milyen bájtsorozat kerüljön a fájlba.** Ehhez konkrét kódolásra van szükség, például UTF-8-ra vagy UTF-16-ra. | + | A kódolás által kezelt karakterek összességét |
| - | // | + | ==== 4. Hogyan kerültek be az ékezetes betűk? ==== |
| - | ==== UTF-8 kódolás ==== | + | Kézenfekvő megoldás volt a teljes bájt kihasználása: |
| - | Az **UTF-8** a Unicode-karakterek bájtokkal történő ábrázolásának egyik módja. **Változó hosszúságú kódolás:** egy kódolható Unicode-kódponthoz 1, 2, 3 vagy 4 bájtot rendel. | + | Az összes nyelv betűi azonban 256 helyre sem férnek el. Ezért különböző nyelvekhez és régiókhoz eltérő táblázatokat készítettek. Ezeket |
| - | Fontos tulajdonságai: | + | Például a **Windows-1250** közép-európai karaktereket, |
| - | * Az ASCII-karaktereket változatlan kóddal, **egy bájton** tárolja. | + | Nézzünk |
| - | * A magyar ékezetes betűk szokásos, önálló kódponttal megadott alakja **két bájtot** foglal. | + | |
| - | * Sok további jel, például az eurójel, **három bájtot** igényel. | + | |
| - | * Egyes további karakterek, például számos emoji alapkaraktere, | + | |
| - | ^ Karakter | + | ^ A fájlban tárolt bájt értéke |
| - | | A | '' | + | | 245 | ő | õ | |
| - | | ó | '' | + | |
| - | | ő | '' | + | |
| - | | Ω | '' | + | |
| - | | € | '' | + | |
| - | **Példa:** a '' | + | Ha egy Windows-1250 szerint mentett fájlt Windows-1252 szerint olvasunk, az '' |
| - | < | + | További régi kódlapnevekkel is találkozhatunk: |
| - | Karakter: m | + | |
| - | UTF-8 (hex): | + | |
| - | Bájtok száma: | + | |
| - | </ | + | |
| - | Ebben a számításban nincs sortörés vagy más kiegészítő jel a szöveg végén, | + | ^ Név ^ Hol találkozhatunk vele? ^ |
| + | | IBM CP852 | Régi DOS-os, közép-európai szövegekben. | | ||
| + | | ISO-8859-1, | ||
| + | | ISO-8859-2, más néven Latin-2 | Közép- és kelet-európai szövegekben; | ||
| - | // | + | Ezek nevét nem szükséges bemagolni. A lényeg az, hogy **a kódlap neve határozza meg, melyik táblázat szerint értelmezzük |
| - | === Az UTF-8 bitmintái – kiegészítő magyarázat === | + | Egyes programok az **ANSI** nevet használják egy régi Windowsos kódlap megjelölésére. Ez önmagában nem egyértelmű: |
| - | Az UTF-8 bájtjainak elején található bitek jelzik a bájt szerepét. Az alábbi táblázatban az '' | + | ==== 5. Unicode: legyen közös azonosítójuk |
| - | ^ Teljes hossz ^ A bájtok bitmintája ^ | + | A kódlapokkal két probléma adódik. Egyrészt ugyanaz a szám különböző karaktereket jelenthet. Másrészt egyetlen ilyen kódlapba nem férnek bele a sokféle nyelv betűi és a műszaki jelek. |
| - | | 1 bájt | '' | + | |
| - | | 2 bájt | '' | + | |
| - | | 3 bájt | '' | + | |
| - | | 4 bájt | '' | + | |
| - | Többbájtos kódolás esetén az első bájt elején álló 1-esek száma a **teljes bájtsorozat hosszát** jelzi. A további, úgynevezett folytató bájtok mindig '' | + | A **Unicode** olyan nemzetközi szabvány, amely közös rendszerben rendel számazonosítókat a karakterekhez. Tartalmazza számos mai és történeti írásrendszer betűit, valamint matematikai, műszaki és egyéb jeleket is. |
| - | Az egyes kódpontokat a legrövidebb megengedett alakban kell kódolni. A táblázat szerkezeti vázlat: nem minden lehetséges | + | Az alapgondolat egy nagy közös jegyzékhez hasonlítható: az '' |
| - | === Az ó betű kódolása === | + | ^ Karakter ^ Unicode-azonosító tízes számrendszerben ^ |
| + | | A | 65 | | ||
| + | | ó | 243 | | ||
| + | | ő | 337 | | ||
| + | | Ω | 937 | | ||
| + | | € | 8364 | | ||
| - | Az '' | + | A karakterhez rendelt ilyen azonosítót **kódpontnak** nevezzük. Például az '' |
| - | Ez nem fér el a 7 bites ASCII-tartományban, | + | A Unicode megtartotta az ASCII karaktereinek számértékeit: |
| - | < | + | === Miért látunk betűket is a kódpontok leírásában? |
| - | Kódpont 11 biten: | + | |
| - | Felbontás 5 + 6 bitre: 00011 110011 | + | |
| - | UTF-8-minta: | + | A szakmai leírások a kódpontokat rendszerint **tizenhatos, |
| - | Adatbitek behelyettesítése: | + | |
| - | 11000011 10110011 | + | |
| - | Hexadecimálisan: | + | Ebben a számrendszerben a 0–9 számjegyeken kívül az A, B, C, D, E és F jelet is használjuk. Ezek rendre a 10, 11, 12, 13, 14 és 15 értéket jelentik. A helyi értékek jobbról balra 1, 16, 256 és így tovább. |
| - | </ | + | |
| - | Az '' | + | Például |
| - | ==== UTF-16 és BOM – rövid kitekintés ==== | + | A Unicode-kódpontok szokásos jelölése '' |
| - | Az **UTF-16** szintén Unicode-kódolás. Egy kódolható Unicode-kódpontot **egy vagy két 16 bites egységgel**, | + | ^ Karakter ^ Azonosító tízes számrendszerben ^ Ugyanaz a kódpont |
| + | | A | 65 | '' | ||
| + | | ó | 243 | '' | ||
| + | | ő | 337 | '' | ||
| - | Mivel egy 16 bites egység két bájtból áll, meg kell határozni e bájtok sorrendjét: | + | A bevezető nullák a szám értékét nem változtatják |
| - | * **Big-endian:** a nagyobb helyi értékű bájt kerül előre. | + | ==== 6. UTF-8: hogyan tároljuk |
| - | * **Little-endian:** a kisebb helyi értékű bájt kerül előre. | + | |
| - | Például az '' | + | A közös azonosítók bevezetésével még nem oldottunk meg mindent. Az '' |
| - | A fájl elején elhelyezett | + | Erre szolgál például az **UTF-8**. Ez egy pontosan meghatározott szabályrendszer, |
| - | ^ Kódolás ^ BOM-bájtok hexadecimálisan ^ | + | **A Unicode azt adja meg, melyik karakterről van szó. Az UTF-8 azt határozza meg, hogyan tároljuk azt bájtokkal.** |
| - | | UTF-16, big-endian bájtsorrend | '' | + | |
| - | | UTF-16, little-endian bájtsorrend | '' | + | |
| - | | UTF-8 | '' | + | |
| - | **A BOM nem minden esetben kötelező.** A bájtsorrendet például a formátum vagy egy külön kódolásmegjelölés is meghatározhatja. | + | Az UTF-8 egy kódolható kódponthoz 1, 2, 3 vagy 4 bájtot rendel. Az ASCII-karaktereket egy bájton, eredeti számértékükkel tárolja. A többi karakterhez több bájtot használ. Az alábbi példákban minden betűt egyetlen Unicode-kódponttal írunk le. |
| - | ==== Gyakorlati karakterkódolási problémák ==== | + | ^ Karakter ^ Unicode-azonosító tízes számrendszerben ^ UTF-8-ban tárolt bájtok értékei, szintén tízes számrendszerben ^ Bájtok száma ^ |
| + | | A | 65 | 65 | 1 | | ||
| + | | ó | 243 | 195, 179 | 2 | | ||
| + | | ő | 337 | 197, 145 | 2 | | ||
| + | | € | 8364 | 226, 130, 172 | 3 | | ||
| - | === Miért romlanak | + | A táblázatban a vesszők a külön bájtokat választják |
| - | Ha a fájl UTF-8-ban készült, de az olvasó program más kódlap szerint értelmezi | + | **Miért kell két bájt az ó betűhöz, ha a 243 még elférne egy bájtban?** Mert az UTF-8 nem egyszerűen a kódpont számértékét írja egy bájtba. Az egybájtos alakot a 0–127 közötti ASCII-kódoknak tartja fenn; a többi karakter tárolására külön szabályt alkalmaz. Ennek bitenkénti működését később, kiegészítésként vezetjük le. |
| - | Például az '' | + | === Hány bájt egy szó? === |
| - | **A fájlban lévő bájtok ekkor még lehetnek helyesek; | + | Nézzük |
| - | Egy szövegfájl kódolása nem mindig állapítható meg biztosan pusztán a tartalmából. A '' | + | ^ Betű ^ UTF-8-ban szükséges hely ^ |
| + | | m | 1 bájt | | ||
| + | | é | 2 bájt | | ||
| + | | r | 1 bájt | | ||
| + | | ő | 2 bájt | | ||
| + | | **Összesen** | **6 bájt** | | ||
| - | === Mit tegyünk hibásan megjelenő szöveg esetén? === | + | A szó tehát **4 betűből áll, de 6 bájtot foglal**. Itt csak a négy betű tárolási helyét számoltuk; nem adtunk hozzá sortörést vagy fájleleji jelzést. |
| - | - Őrizzük meg az eredeti fájlt. | + | // |
| - | - Ellenőrizzük, milyen kódolással exportálták vagy mentették. | + | |
| - | - A megnyitó programban válasszuk ki a megfelelő kódolást. | + | |
| - | - Csak a helyesen megjelenő szöveget alakítsuk át más kódolásra, | + | |
| - | **A más kódolással történő megnyitás és az átkódolás nem ugyanaz.** Megnyitáskor | + | ==== 7. Mit jelent mindez |
| - | Ha például Unicode-szöveget olyan régi kódlapra mentünk, amely nem tartalmaz minden szükséges jelet, **információvesztés** történhet. A hiányzó jelek helyére kérdőjel vagy helyettesítő karakter kerülhet. Ez utólag pusztán a kódolás átállításával már nem feltétlenül javítható. | + | === Miért jelenik meg hibás szöveg? === |
| - | === Karakterkódolás vagy betűtípushiba? | + | Korábban láttuk, hogy két régi kódlap eltérően értelmezheti ugyanazt a bájtot. Hasonló hiba történhet akkor is, ha egy UTF-8-fájlt egy régi kódlap szerint nyitunk meg. |
| - | A **karakterkódolás** azt határozza meg, hogyan értelmezzük | + | Az '' |
| - | Ha értelmetlen betűsorok jelennek meg az ékezetek helyén, gyakran kódolási hiba történt. Ha egy jel helyén üres négyzet látható, előfordulhat, | + | **A fájl adatai még lehetnek helyesek; |
| - | === Mérnöki adatcsere === | + | A '' |
| - | Mérési adatokat tartalmazó CSV-fájlnál külön kell megadni vagy ellenőrizni: | + | === Megnyitás és átkódolás === |
| - | * a **karakterkódolást**, | + | Hibás ékezetek esetén először őrizzük meg az eredeti fájlt, és próbáljuk meg a készítésekor használt kódolással megnyitni. |
| - | * az **oszlopelválasztót**, például pontosvessző vagy vessző; | + | |
| - | * a **tizedesjelet**, | + | |
| - | Ezek különböző beállítások. A helyes kódolás önmagában | + | * **Más kódolással történő megnyitáskor** ugyanazokat a bájtokat értelmezzük más szabály szerint. A fájl tartalmát ettől még nem írjuk át. |
| + | * **Átkódoláskor** | ||
| - | Például egy műszer | + | Például egy Windows-1250-fájl UTF-8-ra alakításakor az '' |
| - | Új szöveges adatcsere kialakításakor célszerű az UTF-8-at választani, amennyiben | + | Ha a helytelenül megjelenített szöveget mentjük újra, a hibát is elmenthetjük. Ha pedig olyan kódlapot választunk, |
| - | ==== Base64 – bináris | + | === Mérési |
| - | A **Base64 nem karakterkódolás** az ASCII vagy az UTF-8 értelmében. Feladata, hogy egy tetszőleges bájtsorozatot korlátozott készletből választott, | + | A **CSV** olyan szöveges fájlformátum, amely táblázatos adatokat tárol: a sorokon belüli mezőket például vessző vagy pontosvessző választja el. Egy mérési eredményeket tartalmazó fájlban ilyen oszlopnév is szerepelhet: |
| - | Így például kép, tömörített fájl vagy más bináris adat is továbbítható olyan környezetben, | + | A fájl beolvasásakor három külön beállításra lehet szükség: |
| - | **A Base64 nem titkosítás:** az eredeti adat titkos kulcs nélkül visszaállítható. | + | |
| + | * **Mezőelválasztó: | ||
| + | | ||
| - | === A kódolás elve === | + | A hibás ékezet és az egy oszlopba összecsúszott táblázat tehát nem ugyanaz a probléma. |
| - | A Base64 a bemeneti adat bitjeit **6 bites csoportokra** osztja. Hat bit 64 különböző értéket vehet fel, ezért 64 különböző adatjelre van szükség: | + | === A betűtípus szerepe === |
| - | ^ Érték | + | A karakterkódolás mellett a megjelenítésnek is helyesen kell működnie. A **betűtípus** adja meg a jelek kirajzolható alakját. Előfordulhat, |
| + | |||
| + | Az értelmetlen ékezetes betűsor gyakran kódolási problémára, | ||
| + | |||
| + | ==== 8. Kiegészítés: | ||
| + | |||
| + | Az UTF-8 bájtjai nemcsak a kódpont bitjeit tartalmazzák. Bizonyos bitek azt jelzik, hogy egyetlen bájtról, több bájtból álló sorozat kezdetéről vagy annak folytatásáról van-e szó. | ||
| + | |||
| + | A következő táblázatban a leírt 0-k és 1-ek rögzített **jelzőbitek**. Az '' | ||
| + | |||
| + | ^ Teljes hossz ^ Bitminta ^ | ||
| + | | 1 bájt | '' | ||
| + | | 2 bájt | '' | ||
| + | | 3 bájt | '' | ||
| + | | 4 bájt | '' | ||
| + | |||
| + | Például a '' | ||
| + | |||
| + | === Az ó betű levezetése === | ||
| + | |||
| + | Az '' | ||
| + | |||
| + | A 243 nagyobb 127-nél, ezért nem használhatjuk az egybájtos alakot. A kétbájtos mintában viszont 5 + 6 = 11 adatbitnek van helye, ami elegendő. A nyolc bit elé ezért három nullát írunk, majd az eredményt 5 és 6 bites részre bontjuk: | ||
| + | |||
| + | < | ||
| + | 243 kettes számrendszerben: | ||
| + | 11 bitre kiegészítve: | ||
| + | Felbontás: | ||
| + | </ | ||
| + | |||
| + | Ezután az első öt bit elé '' | ||
| + | |||
| + | < | ||
| + | Első bájt: | ||
| + | Második bájt: 10 + 110011 = 10110011 | ||
| + | </ | ||
| + | |||
| + | Az első bájt értéke 195, a másodiké 179. Így kaptuk meg a korábbi táblázatban szereplő két számot. | ||
| + | |||
| + | Hexadecimálisan 195 = '' | ||
| + | |||
| + | **A U+00F3 és a C3 B3 két különböző dolgot jelöl:** az első az '' | ||
| + | |||
| + | // | ||
| + | |||
| + | ==== 9. Kiegészítés: | ||
| + | |||
| + | Ugyanazokat a Unicode-karaktereket az UTF-8-tól eltérő módon is lehet tárolni. Ilyen kódolás az **UTF-16**, amely egy kódolható kódponthoz 2 vagy 4 bájtot használ. | ||
| + | |||
| + | Az '' | ||
| + | |||
| + | ^ Sorrend neve ^ Az A tárolt bájtjai tízes számrendszerben ^ Magyarázat ^ | ||
| + | | Big-endian | 0, 65 | A nagyobb helyi értékű bájt kerül előre. | | ||
| + | | Little-endian | 65, 0 | A kisebb helyi értékű bájt kerül előre. | | ||
| + | |||
| + | A két változat neve **UTF-16BE**, | ||
| + | |||
| + | A fájl elejére speciális jelzés is kerülhet, amely segít a bájtsorrend felismerésében. Ezt **BOM**-nak (Byte Order Mark, bájtsorrendjelző) nevezzük. A BOM nem a szöveg részeként olvasandó betű vagy szó. | ||
| + | |||
| + | A BOM használata nem minden esetben kötelező: a kódolást és a sorrendet más módon is megadhatják. UTF-8-fájl elején is előfordulhat BOM, de ott csak a kódolásra utaló jelzés, mert UTF-8-nál nincs választható bájtsorrend. | ||
| + | |||
| + | ==== 10. Base64: hogyan legyen egy fájlból továbbítható szöveg? ==== | ||
| + | |||
| + | Eddig szövegek tárolásáról volt szó. Most más feladatot vizsgálunk: | ||
| + | |||
| + | A fájl bájtjait nem kezelhetjük egyszerűen betűkként. Tetszőleges értékeik lehetnek, köztük olyanok, amelyeket a fogadó program vezérlőjelként értelmezne. Célszerű ezért az adatot egy szűk, előre rögzített készletből választott, | ||
| + | |||
| + | Erre szolgál a **Base64**. Tetszőleges bemeneti bájtokat alakít át betűkből, számjegyekből és néhány további jelből álló szöveggé. Ilyen megoldást használnak például számos e-mail-melléklet átvitelekor. | ||
| + | |||
| + | **Az UTF-8 szöveges karaktereket alakít bájtokká. A Base64 tetszőleges bájtokat alakít szöveges jelekké.** | ||
| + | |||
| + | A Base64 nem titkosítás: | ||
| + | |||
| + | === Miért éppen 64? === | ||
| + | |||
| + | A Base64 a bemeneti biteket **hatos csoportokba** rendezi. Hat bit 64 különböző értéket adhat, 0-tól 63-ig. Mindegyik értékhez egy nyomtatható jelet rendel: | ||
| + | |||
| + | ^ A hat bit értéke | ||
| | 0–25 | '' | | 0–25 | '' | ||
| | 26–51 | '' | | 26–51 | '' | ||
| Line 224: | Line 286: | ||
| | 63 | ''/'' | | 63 | ''/'' | ||
| - | A kódolás **3 bemeneti bájtból 4 kimeneti karaktert** állít elő, mert 3 × 8 = 4 × 6 = 24 bit. A végén szükség esetén külön kitöltő jel, az '' | + | Az értékek sorrendben követik egymást: 0 jelentése '' |
| + | |||
| + | **Ez a Base64 saját táblázata, | ||
| === Példa: Man === | === Példa: Man === | ||
| - | Kódoljuk | + | Használjuk bemenetként |
| < | < | ||
| - | Karakterek: | + | M: 77 = 01001101 |
| - | ASCII-bájtok: 01001101 01100001 01101110 | + | a: 97 = 01100001 |
| + | n: 110 = 01101110 | ||
| + | </ | ||
| - | 6 bites csoportok: 010011 010110 000101 101110 | + | Ez összesen 24 bit. A bitek sorrendjén nem változtatunk, |
| - | Decimális értékek: 19 | + | |
| - | Base64-jelek: | + | < |
| + | Három bájt: 01001101 01100001 01101110 | ||
| + | Négy hatos csoport: 010011 010110 000101 101110 | ||
| </ | </ | ||
| - | Az eredmény tehát **TWFu**. | + | A hatbites csoportokat számként értelmezzük, |
| - | === Mi történik, ha nem teljes a három bájtos csoport? === | + | ^ Hat bit ^ Értéke tízes számrendszerben ^ Base64-jel ^ |
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| - | A bemenet bájtokból áll, de a bájtok száma nem mindig osztható hárommal. Az utolsó 6 bites adatcsoportot ilyenkor jobbról nulla bitekkel egészítjük ki, a hiányzó kimeneti karakterek helyére | + | Például '' |
| - | ^ Az utolsó csoport bemenete ^ Kimeneti adatjelek száma ^ Kitöltés ^ | + | Dekódoláskor ugyanezt végezzük fordítva: a négy jelből négy hatbites csoportot kapunk, majd a 24 bitet három nyolcbites bájtra bontjuk vissza. |
| - | | 3 bájt | 4 | Nincs | | + | |
| - | | 2 bájt | 3 | Egy '' | + | |
| - | | 1 bájt | 2 | Két '' | + | |
| - | **Egybájtos példa:** kódoljuk | + | === Miért jelenik meg egyenlőségjel |
| - | < | + | Nem minden fájl bájtszáma osztható hárommal. Ha a végén csak egy vagy két bájt marad, az utolsó hatbites csoporthoz nulla biteket kell hozzáadnunk. |
| - | Bemenet: | + | |
| - | 6 bites csoportok: 000000 01 | + | |
| - | Nullákkal kiegészítve: | + | |
| - | 000000 010000 | + | |
| - | Értékek: | + | |
| - | Adatjelek: | + | |
| - | Kitöltéssel: | + | |
| - | </ | + | |
| - | **Kétbájtos példa:** kódoljuk | + | A '' |
| - | < | + | ^ Az utolsó csoportban maradt adat ^ Base64-adatjelek ^ Kitöltés ^ |
| - | Bemenet: | + | | 3 bájt | 4 jel | Nincs | |
| - | 6 bites csoportok: 000000 100000 0001 | + | | 2 bájt | 3 jel | Egy '' |
| - | Nullákkal kiegészítve: | + | | 1 bájt | 2 jel | Két '' |
| - | 000000 100000 000100 | + | |
| - | Értékek: | + | |
| - | Adatjelek: | + | |
| - | Kitöltéssel: | + | |
| - | </ | + | |
| - | Dekódoláskor | + | **Példa egyetlen bájttal:** legyen a bemenet |
| - | === Méretnövekedés | + | - Hat bit után elvágjuk: '' |
| + | - A második csoportot négy nullával egészítjük ki: '' | ||
| + | - A két csoport értéke 0 és 16. A Base64-táblázat szerint ezek jele '' | ||
| + | - Két adatjelünk van, ezért még két '' | ||
| - | Három bemeneti bájtból négy ASCII-karakter, | + | Az eredmény |
| - | Például 300 bájt adat Base64-alakja 400 karakterből áll, a sortörések és más kiegészítő adatok nélkül. | + | === Mennyivel nő az adat mérete? === |
| - | A MIME szerinti | + | A Base64 |
| - | Ha szöveget szeretnénk Base64-kódolni, előbb meg kell határozni annak bájtjait, például UTF-8 használatával. **A Base64 | + | Például **300 bájt adatból 400 bájt** lesz, a sortöréseket és egyéb kiegészítéseket nem számítva. Ez körülbelül |
| + | |||
| + | A Base64 | ||
| ==== Ellenőrző kérdések ==== | ==== Ellenőrző kérdések ==== | ||
| - | - Miért nem ábrázolható | + | |
| - | - Mi a különbség | + | |
| - | - Hány bájt a '' | + | - Mit jelent |
| - | - Mit érdemes először ellenőrizni, | + | |
| - | - Mi a különbség | + | - Hány bájtot foglal |
| - | - Titkos adatnak tekinthető-e egy Base64-kódolt jelszó? Indokolja a választ! | + | - Mi a különbség |
| - | - Hány karakterből áll 300 bájt adat Base64-alakja, sortörések nélkül? | + | - Miért nem szabad titkosításként használni a Base64-et? |
| + | - Miért lesz három bájtból négy Base64-jel? | ||
| === Megoldások === | === Megoldások === | ||
| - | - Az ASCII-karakterkészlete | + | |
| - | - A kódpont a karakter | + | |
| - | - Hat bájt: 1 + 2 + 1 + 2 = 6 byte. | + | - A kódpont a karakter |
| - | - Azt, hogy a megnyitóprogram a fájl eredeti karakterkódolását használja-e. | + | |
| - | - Megnyitáskor a meglévő bájtokat értelmezzük; | + | - Hat bájtot: 1 + 2 + 1 + 2. |
| - | - Nem. A Base64 | + | - Megnyitáskor a meglévő bájtokat értelmezzük; |
| - | - Négyszáz karakterből. | + | - Mert a kódolt adat kulcs nélkül |
| - | + | - Három bájt 24 bit; ebből négy hatbites csoport készül, és minden csoporthoz egy jel tartozik. | |
tanszek/oktatas/szamitastechnika/karakterkodolas.1790790006.txt.gz · Last modified: by knehez
