Lietuviškos raidės utf-8 koduotėje

Jei reikia kad tinklalapis būtų rodomas utf-8 koduote, bet vietoje lietuviškų raidžių rodo kažką panašaus į šį tekstą: ĖĮŠŲÅŖŽ. Reiškia reikia patikrinti ar visur yra nustatyta utf-8 koduotė.

1. Jei duomenis yra saugomi MySQL duomenų bazėje reikia nustatyti bazei, visoms lentelėms ir tekstiniams laukams utf-8 koduote t. y. Collation turi būti utf8_general_ci, o taip pat jungiantis per php prie mysql reikia nustatyti kad duomenis bus imami irgi utf-8 koduote t. y. po mysql_select_db komandos reikia įvykdyti užklausą:

mysql_query("SET NAMES 'utf8'");

Norint surūšiuoti stulpelį pagal lietuvišką ar kitą abėcėlę reikia nurodyti kalbos lyginimą (collation), pvz. lietuvių kalbos COLLATE utf8_lithuanian_ci:

SELECT *
FROM my_table 
ORDER BY my_value COLLATE utf8_lithuanian_ci ASC

2. Patikrinti puslapių html koduotę, turi būti nurodyta tarp <head></head>:

<meta http-equiv=Content-Type content=text/html; charset=utf-8>

Arba trumpiau:

<meta charset="utf-8">

Taip pat php ir kiti failai turi būti utf-8 nors tai nebūtina, nebent php skripte naudojami ne ascii simboliai.

3. Ir po šių nustatymų Internet explorer vis tiek ne visada rodo taisyklingai lietuviškas raides (dėl naršyklės automatinės koduotės nustatymų), reiškia reikia patikrinti ar serveris siunčia duomenis utf-8 koduotėje, tai galima nustatyti gauto iš serverio puslapio antraštėje (header) arba su web-sniffer.net . Jei Content-Type nėra utf-8 arba jo išvys nėra reiškia reikia įterpti į puslapį tokia php antraštę:

header('Content-Type: text/html; charset=utf-8');

arba sukurti serveryje šakniniame kataloge failą .htaccess ir jame įrašyti:

AddDefaultCharset utf-8

daugiau apie Apache serverio konfiguracija http://httpd.apache.org/docs/2.2/mod/core.html#adddefaultcharset

4. Jei naudojamos php teksto funkcijos strlen(), substr(), strtolower(), strtoupper() ir pan. Tai utf-8 koduotės tekstui galima naudoti analogines multibaitines funkcijas mb_strlen(), mb_substr(), mb_strtolower(), mb_strtoupper(), tik su mb_internal_encoding() reikės nurodyti kokią koduotę naudoti šiose funkcijose.

mb_internal_encoding("UTF-8");
echo mb_strlen("Ąžuolas"); //7
echo mb_strpos("Ąžuolas", "ž"); //1
echo mb_substr("Ąžuolas", 1, 1); //ž
echo mb_strtolower("Ąžuolas"); //ąžuolas
echo mb_strtoupper("Ąžuolas"); //ĄŽUOLAS

Taip pat HTML kodų konvertavimo funkcijoms reikia nurodyti koduotę:

echo htmlentities("'Ąžuolas'", ENT_QUOTES, "UTF-8"); //&#039;Ąžuolas&#039;
echo html_entity_decode("Ą&#382;uolas", ENT_QUOTES, "UTF-8"); //Ąžuolas

5. Tekstus kuriuose yra lietuviškų raidžių saugoti utf-8 koduotėje, o php skriptus dar ir be BOM (Byte Order Mark - unicode žymė), nes PHP iki 6.0 versijos nesupranta BOM. Vienas iš nemokamų teksto redaktorių, kuris saugo utf-8 koduotėje be BOM yra notepad++.

Be to visos šios taisyklės tinka bet kuriai kalbai, nebūtinai tik lietuvių, nes naudojama daugiakalbė utf-8 koduotė.

Šis įrašas buvo paskelbtas kategorijoje Programavimas su žyma , , , . Įrašykite į adresyną nuolatinę nuorodą.

2 komentarai į "Lietuviškos raidės utf-8 koduotėje"

  1. pas mane anksciau viskas veike, bet kaip idejau nauja saukykla ten kazkoks java scriptinis tai ir eveikia lt raides, viska ismeginau kaip cia surasyta bet deje ;// nezinai kame problema gali buti?

    • polyetilen

      volume.lt html kode du kartus nurodyta koduotė

      <meta http-equiv='Content-Type content=text/html; charset=utf-8>
      <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
      

      reikia pirmą ištrinti ir palikti antrą koduotės aprašymą:

      <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
      

      nes naršyklė ima tik pirmą koduotės žymę (kitas praleis), bet ten klaida yra praleista kabutė, tai reiškia koduotės nėra ir naršyklė paima koduotę pagal nutylėjima iš savo nustatymų.

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *