Egy szövegkorlátot a rendszer által ténylegesen mért mennyiséggel ellenőrizz. Az UTF-8-bájtok, a Unicode-kódpontok és a JavaScript UTF-16-kódegységei külön számlálások. Ékezet és emoji mellett már egy rövid szó is megmutatja a különbséget.
Ugyanaz a szó két számlálásban
A „tükör” szó öt betűből áll. A szokásos, előre összeállított ékezetes karakterekkel UTF-8-ban hét bájt: a t, k és r egy-egy, az ü és ö két-két bájtot foglal. Az „alma” négy karaktere négy bájt ugyanebben a kódolásban.
Egy 😀 jel egy Unicode-kódpont, UTF-8-ban négy bájt, JavaScriptben a szokásos length tulajdonság szerint két UTF-16-kódegység. Ezért ugyanarra a szövegre több, önmagában helyes hosszadat is adódhat.
Mit számol a TextEncoder?
A böngészős TextEncoder UTF-8-bájtokra alakítja a szöveget. A kapott tömb hossza a kódolt bájtszám. A „tükör” szóból előállított bájttömb hossza 7 a fent leírt karakteralakokkal. A JavaScript sztring saját length értéke ugyanitt 5.
A látható „é” egyetlen előre összeállított kódpontként vagy e és kombináló ékezet összekapcsolásával is előállhat. A két forma hasonlóan látszhat, miközben a bájtsora eltér. A Unicode-normalizálás ezt sok esetben egységesítheti, de csak tudatosan megválasztott szövegfeldolgozási lépésként alkalmazd.
Melyik számot használd?
Fájlméretnél a bájtszám, felhasználói szövegkorlátnál a szabály szerint meghatározott karakterfogalom számít. Egy tízbájtos adatmezőbe öt többbájtos jel már nem feltétlenül fér be. Bájt közepén történő vágás sérült kódolást okozhat.
A szövegstatisztikai eszköz eredményénél nézd meg a számlálás definícióját. Tesztelj sima latin betűt, magyar ékezetet, emojit és sortörést is. Ezekből gyorsan kiderül, hogy a célrendszer a számodra megfelelő hosszúságot méri-e.
Mi fér egy tízbájtos mezőbe?
A „tükör😀” szövegben 6 Unicode-kódpont van. JavaScriptben 7 UTF-16-kódegységet, UTF-8-ban 11 bájtot foglal: a szó 7 és az emoji 4 bájtja összeadódik. Egy pontosan 10 UTF-8-bájtos mezőbe tehát nem fér bele, akkor sem, ha a rendszer felületén csak hat jelet látsz. Három önálló 😀 jel 12 bájt, ezért az sem férne el.
Az előre összeállított é, U+00E9 UTF-8-ban 2 bájt. Az e, U+0065 és a kombináló éles ékezet, U+0301 együtt 3 bájt. NFC-normalizálás ebben a konkrét esetben az első, 2 bájtos alakot adja. Ha a fogadó rendszer normalizál, a hosszkorlátot az előírt normalizálás után mérd; ha a feladat a fájl eredeti bájtjait vizsgálja, őrizd meg az eredeti alakot. Rövidítéskor teljes karakteregységeket kezelő megoldás kell, mert egy bájthatár az emoji belsejébe is eshet.
Kapcsolódó DG Kalkulátor megnyitása
Forrás és módszertani háttér
A számpéldák saját szemléltető számítások.
Háromkérdéses tudáspróba
Válassz kérdésenként egy választ, és jegyezd fel az A, B vagy C betűt. Előbb oldd meg mindhárom feladatot, utána nézd meg a megoldásokat.
1. Hány UTF-8-bájt az „alma”?
- A) 2
- B) 8
- C) 4
2. A „tükör” a cikkben használt alakban hány bájt?
- A) 7
- B) 5
- C) 10
3. A „tükör” UTF-8-ban 7 bájt, a 😀 4 bájt. Belefér a „tükör😀” szöveg egy 10 UTF-8-bájtos mezőbe?
- A) Nem: összesen 11 bájt
- B) Igen: csak 6 kódpont
- C) Igen: a JavaScript length értéke 7
Megoldások és önálló pontozás
Minden helyes válasz 1 pont; a hibás vagy kihagyott válasz 0 pont. Legfeljebb 3 pont szerezhető. 3 pont: A megadott hosszkorláthoz megfelelő számlálást választottál, és az ékezetes szöveg bájtigényével számoltál. 2 pont: nézd át az eltévesztett kérdésnél megnevezett részt, és számold újra annak példáját. 0–1 pont: haladj végig a három megoldáson, majd oldd meg újra a kérdéseket. Ez a rövid próba a cikk összefüggéseinek megértését ellenőrzi.
1. megoldás
C) 4 – Mind a négy ASCII-betű egy bájt. Ha más választ adtál vagy kihagytad, ezt a részt ismételd át: Ugyanaz a szó két számlálásban.
2. megoldás
A) 7 – Három egybájtos és két kétbájtos karakterből áll. Ha más választ adtál vagy kihagytad, ezt a részt ismételd át: Ugyanaz a szó két számlálásban.
3. megoldás
A) Nem: összesen 11 bájt – A korlát bájtokra vonatkozik, ezért 7 + 4 = 11-gyel kell összevetni a 10-et. A kódpontszám és az UTF-16-kódegységek száma ennél a korlátnál más mennyiséget mér. Ha más választ adtál vagy kihagytad, ezt a részt ismételd át: Mi fér egy tízbájtos mezőbe?.