A karakterkódolás misztikuma egy többnyelvű oldalon

UTF-8 karakterkódolás

Egy új projektem keretén belül szembe kerültem néhány újabb problémával, amit szeretnék veletek megosztani. A projekt (a BigLike.eu weboldalon megtekinthető) lényege, hogy megállapítsuk a felhasználó származási helyét és ez alapján a legpraktikusabb nyelvet kínáljuk fel a számára. Persze ez nem ilyen egyszerű, a karakterkódolást is megfontoltan kell kiválasztanunk. A témával kapcsolatban mindenre fény derül.

Aki már foglalkozott bárminemű fejlesztéssel a weben vagy egyszerű kliensoldali programmal kapcsolatban, valószínűleg már szembekerült a karakterkódolással, mint hatalmas problémával. A magyarok főként ISO-8859-2 kódolást használnak az ő és ű betű helyes megjelenítése érdekében, ez a szabvány csupán 8 biten tárolja a betűket, ráadásul Java/Javascrip/Flash használatához általában sem túl praktikus, hiszen sokszor konvertálást igényel.

A legjobban elterjedt és a platformok közti legkönnyebb kommunikációt lehetővé tevő karakterkódolás nem más, mint az UTF-8. A karakterkódolás az alap betűkészletet 8 biten tárolja, de rugalmasságának köszönhetően a 16 bit sem jelent neki problémát. Míg a latin ABC betűi 1 bájton helyezkednek el, a magyar ékezetes betűket már két bájton (16bit) tárolja, ami okozhat némi problémát, ha úgy döntenénk, hogy otthagyjuk a magyarok számára jól bevált ISO-8859-2 kódolást. (Viszont ez a probléma még mindig jóval kisebb, mint ha megmaradnánk az ISO-nál.)

Nyelv megállapítása

A többnyelvű oldalak létrehozásánál fel kell tennünk a kérdést, hogy hogyan is szeretnénk kivitelezni a dolgot. A legelterjedtebb, hogy a felhasználó alapvetően angol felületet kap, ahol kiválaszthatja az általa beszélt nyelvet (már persze, ha elérhető). Ez a megoldás nem túl praktikus az angolul kevésbé értő felhasználók miatt. Létezik aztán az a megoldás, amikor megpróbáljuk eltalálni a felhasználó nyelvét, erre több módszer is létezik, ezért ez a módszer – annak ellenére, hogy időigényesebb – sokkal hatékonyabb és felhasználóbarátabb, mint a korábbi megoldás.

Az első, viszonylag hatékony módszer az IP cím alapján történő GEO Lokáció. Ezzel megtudhatjuk, hogy az adott felhasználó IP címe milyen földrajzi ponthos van hozzárendelve. Sajnos sok szolgáltató téves, vagy elavult információkkal látja el az IP címet, így egyes esetekben teljesen használhatatlan ebből az információból dolgozni. De mégis megéri! A hostip.com arra szakosodott, hogy könnyen és gyorsan elárulja egy IP címről, hogy hová is van bejegyezve, mindezt egy rövid szöveges fájllal. (Az API menüpont alatt több információt is megtudhatsz a szolgáltatásról.) Az API használata ingyenes, megbízható és gyors.

Ha esetleg IP cím alapján mégsem sikerülne eldönteni, honnan is jött a felhasználó, akkor a böngésző alapján is tájékozódhatunk. Ehhez nem kell más, mint PHP-ban feldolgozni a $_SERVER[‘HTTP_ACCEPT_LANGUAGE’] változót. Valószínűleg a célközönség olyan nyelven használja az operációs rendszerét és böngészőjét, amilyen nyelvet beszél, így nyugodt szívvel támaszkodhatunk akár erre az információra is.

Végső esetben pedig bevethetjük a “Milyen nyelven is beszélsz?” dialógust. (Persze angol nyelven) Aztán reméljük, hogy a felhasználót ezzel a kis “procedúrával” nem sikerült elkergetnünk. Napjainkban ugyanis akkora mennyiségű információ éri a felhasználókat, hogy egy ilyen időhúzás könnyedén eltántoríthatja eredeti céljától. Ahogy mondják: Ha spórolhatsz egy kattintást, hát tedd meg!

Hozzá kell tennem, hogy érdemes adatbázisban tárolni, hogy az adott IP címhez tartozóan milyen nyelvet használ a felhasználó, így ha később más böngészővel vagy más eszközzel nyitná meg az oldalt akkor kattintás nélkül, automatikusan olyan nyelvre állna be az oldal, amit korábban már egy másik eszközről/böngészőből beállított.

Karakterkódolás

Itt ismét figyelembe kell vennünk több pontot. Egy több nyelvű oldalnál, ahol a magyaron kívül más speciális karaktereket használó nyelvel is dolgozhatnak a felhasználók (pl görög, ciril betük) fontos, hogy az UTF-8-at válasszuk. A mi esetünkben az OpenSearch is UTF-8 alapú (ha nem ismernéd ezt a szolgáltatást, ajánlom figyelmedbe a cikket, amit a linkre kattintva érhetsz el). Az adatbázist is erre a nyelvre állítottuk, így azzal is könnyedén kommunikálunk, a keresőmotorok is jól értenek minket és a Facebookkal is egyszerűen tudunk kommunikálni. Csodás!

Viszont ahogy korábban említettem, ügyelnünk kell arra, hogy a magyar és egyéb speciális karaktereket 2 bájton tárolja, így ha a szövegeket nyirbáljuk, óvatosan tegyük, mert sok alkalmazás harapni tud a “félbevágott” betűkért.Az UTF-8 temérdek előnye mellett a hátránya, hogy több helyet igényel a tárolásához, így ha sok ékezetes betűvel teletömött változókat akarunk adatbázisba menteni, akkor fel kell készülnünk rá, hogy a “tűz” szó nem 3, hanem 4 karakternyi helyet foglal.

(Az UTF-8-ról tudni kell, hogy idegen környezetben krikszkrakszok jelennek, de ebből még mindig egyszerűbb visszafejteni a tartalmat, mint az IS-8859-2 érvénytelen környezetben megjelenő kérdőjeleiből)

itt egy remek függvény az UTF-8 szövegek nyirbálására, anélkül, hogy “félbevágnánk” egyetlen betűt is:

function trim_text($input, $length, $ellipses = true, $strip_html = true) {
	// HTML és PHP kódrészletek eltávolítása, ha kérte
	if ($strip_html) {
		$input = strip_tags($input);
	}
 
	// ha rövidebb mint a határérték, nem kell rövidíteni
	if (strlen($input) <= $length) {
		return $input;
	}
 
	// a szöveg maximális hossza előtti utolsó szóköz
	$last_space = strrpos(substr($input, 0, $length), ' ');
	$trimmed_text = substr($input, 0, $last_space);
 
	// a rövidítést jelentő pontok hozzáadása
	if ($ellipses) {
		$trimmed_text .= '...';
	}
 
	return $trimmed_text;
}

Koller József írása –

Közel tíz éve foglalkozom informatikával, azon belül főként a webfejlesztéssel. Nem vagyok designer, de ettől teljesen függetlenül rajongok a szépen megtervezett grafikákért. Munkám első sorban a háttérben zajlik, ugyanis "kódolással" foglalkozom.

  • Ha tetszett a cikk, osztd meg!