Lietuviškos raidės

Iš PHP, MySQL.
Peršokti į: navigaciją, paiešką

Dažnai programuojant su PHP ir MySQL susiduriama su problema, kuri vadinasi "Lietuviškų raidžių problema". Daug forumų gijų, daug naujienų grupių žinučių, daug emailų yra parašoma, norint paklausti, atsakyti ir išsiaiškinti, kaip teisingai išgauti ir naudoti lietuviškas raides svetainėse. Daug laiko gaištama konvertuojant duomenis failuose, duomenų bazėse keičiantis serverių programiniai įrangai, keičiantis programuotojams, ar tiesiog keičiants darbo įrankiams. Straipsnelio tikslas yra tapti pirminiu (ir tikėkimės paskutiniu) šaltiniu norintiems sužinoti apie lietuviškų raidžių naudojimą programuojant su PHP ir MySQL.

Kam skirtas šis straipsnelis

Čia pabandysiu pateikti trumpą instrukciją, kaip teisingai kurti puslapius su lietuviškų (ir netik!) raidžių atvaizdavimu. Nenorėdamas plėstis į koduočių istorija, įvairumą ir kitas subtiliybes apsiribosiu tik UTF8 koduotės naudojimu. Kodėl? Ogi todėl, kad (teisingai) naudojant utf8 koduotę nebus problemų netik su lietuviškomis raidėmis, bet ir kitų kalbų specialiais simboliais.

Dažnai užduodami klausimai, susisę su šia problema

  • "Neveikia lietuviškos raidės, ką daryti?"
  • "Kodėl vietoje lietuviškų raidžių rodomi klaustukai, "kringeliai", jeroglifai?"

Sprendimas

Norint, kad dirbant kiltu kuo mažiau problemų su lietuviškų/kitų raidžių saugojimu, interpretavimu, reikia laikytis šių 4 punktų:

  • Failai (bylos), kuriuos naudojate programoje, turi būti saugomi UTF-8 koduotėje;
  • Susijungimas su MySQL duomenų baze turi būti UTF-8 koduotėje;
  • Duomenų bazės, duomenų lentelės ir duomenų stulpelio tipai turi būti UTF-8 koduotėje;
  • Failai (bylos), siunčiami klientui (pvz.: HTML, XML) turi turėti UTF-8 antraštes;

Toliau pabandysime aprašyti, kaip įgyvendinti kiekvieną iš paminėtų punktų:

Failų (bylų) saugojimas naudojant UTF-8 koduotę

Tai dažnai pasitaikantis sunkumas dirbant Ms Windows aplinkose. Pavyzdžiui Windows XP Notepad programa išsaugant bylas prideda BOM simbolius, kuriuos PHP interpretuoja kaip duomenis ir tie simboliai yra atvaizduojami PHP rezultatuose, kas sukelia papildomų problemų. Rekomenduojami teksto redaktoriai, kurie palaiko UTF-8 be BOM simbolių failų formatus:

Jų yra ir daugiau. (galite papildyti šį sąrašą)

Susijungimas su MySQL naudojant UTF-8 koduotę

Saugant duomenis MySQL duomenų bazėje yra svarbu, kad siunčiant duomenis į ir iš DB jie būtų siunčiami UTF8 koduotėje. Šiuo metu tai pasiekiama su užklausa:

SET NAMES utf8

Ši užklausa paprastai vykdoma po susijugimo su duomenų baze, vieną kartą.

Duomenų saugojimas duomenų bazėje naudojant UTF-8 koduotę

MySQL duomenų bazėje koduotes galima nustatyti tiek konkrečiai duomenų bazei, tiek lentelei, tiek stulpeliui. Skirtumas yra tas, kad duomenų bazės koduotė yra naudojama, kaip koduotė pagal nutylėjimą kuriant lenteles. Lentelės koduotė yra naudojama, kaip koduotė pagal nutylėjima, kuriant stulpelius. O stulpelių koduotė yra naudojama saugant duomenis įrašuose. Kitaip sakant svarbiausia yra teisingai nustatyti stulpelio koduotę. Taip pat svarbu atkreipti dėmesį į tai, kad MySQL kontekste į koduotės savoką yra apjungtos ir lygiuotės (ar rikiuotės - rikiavimo/lygiavimo taisyklės). Koduotės paprastai žymimos taip:

  • utf8_lithuanian_ci
  • utf8_lithuanian_cs
  • utf8_general_ci
  • utf8_bin
  • latin1_bin
  • latin1_general_ci
  • binary
  • ascii_bin
  • ir pan.

Pirma koduotės aprašymo dalis ("utf8", "latin1") nusako kokia tai yra koduotė. Antra dalis ("lithuanian", "general", "bin") nusako lygiuotę/rikiuotę (kokiomis taisyklėmis duomenys bus rikiuojami ORDER BY atveju). Pavyzdžiui "lithuanian" reiškia, kad rikiuojant bus taikomos lietuvių kalbos taisyklės, ir tokios raidės, kaip "a" ir "ą" eis šalia.

Trečia dalis nusako kaip interpretuojamos didžiosios ir mažosios raidės. Čia "ci" reiškia "Case Insensitive" - didžiosios ir mažosios raidės interpretuojamos vienodai; "cs" - "Case Sensitive" - didžiosios ir mažosios raidės interpretuojamos, kaip skirtingos.

"bin" reiškia, kad naudojama binarinė koduotė, kur visi simboliai interpretuojami individualiai. "bin" apima ir rikiavimo nustatymą, ir didžiųjų/mažųjų raidžių nustatymą.

Rekomenduotina nustatinėti tiek db, tiek lentelių, tiek ir stulpelių koduotes. Tada, tais atvejais, kai pamirštama nurodyti stulpelio koduotę, bus naudojama lentelės koduotė - taip išvengiama papildomų klaidų.

Duomenų bazės sukūrimo užklausa:

CREATE DATABASE `duomenu_baze` DEFAULT CHARACTER SET utf8 COLLATE utf8_lithuanian_ci;

Lentelės ir stulpelių sukūrimo užklausa:

CREATE TABLE `duomenu_baze`.`lentele` (
  `stulpelis` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_lithuanian_ci NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_lithuanian_ci;

Rezultatų (HTML, XML, ir t.t.) interpretavimas naudoajnt UTF-8 koduotę

Svarbu nepamiršti, kad PHP scripto rezultatai, ar statiniai failai internete vienaip ar kitaip yra interpretuojami tam tikrų programų. Dažniausiai PHP rezultatas būna HTML'as, kuris yra interpretuojamas interneto naršyklių (pvz.: FireFox, Internet Explorer, Opera, Safari, Chrome ir pan.). Pats HTML'as turi galimybę per antraštes (header) nurodyti, kokia koduote yra siunčiami duomenys. Todėl teisinga būtų jas ir norodyti:

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

Tam tikras antraštes turi dauguma duomenų siunčiamų internete, todėl svarbu tose antraštėse nurodyti, kad bus naudojama UTF8 koduotė.

Apibendrinimas

Psiaudo kodas, skirtas iliustruoti standartiniam darbui su PHP ir MySQL turint UTF8 palaikymą: scriptas.php (utf8 koduotė)

<?php
mysql_connect(...) or die(...);
mysql_selectdb(...);
mysql_query("SET NAMES 'utf8'") or die(...);
?>
<html>
<head>
...
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
</head>
<body>
<?php
...
?>
</html>
</body>

Čia laikoma, kad: a) duomenų bazės, lentelių bei stulpelių koduotė yra UTF8; b) visi failai (yra išimčių, pvz.: .htaccess) yra UTF8 koduotėje;

Nuorodos