Lietuviškos raidės: Skirtumas tarp puslapio versijų

Iš PHP, MySQL.
Peršokti į: navigaciją, paiešką
46 eilutė: 46 eilutė:
 
Rekomenduotina nustatinėti tiek db, tiek lentelių tiek stulpelių koduotes. Tada, tai retais atvejais, kai pamirštama nurodyti stulpelio koduotę, bus naudojama lentelės koduotė - taip išvengiama papildomų klaidų.
 
Rekomenduotina nustatinėti tiek db, tiek lentelių tiek stulpelių koduotes. Tada, tai retais atvejais, kai pamirštama nurodyti stulpelio koduotę, bus naudojama lentelės koduotė - taip išvengiama papildomų klaidų.
 
=== Rezultatų (HTML, XML, ir t.t.) interpretavimas naudoajnt UTF-8 koduotę ===
 
=== 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:
 +
<pre>
 +
...
 +
<head>
 +
...
 +
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 +
...
 +
</head>
 +
...
 +
</pre>
 +
Tam tikras antraštes turi dauguma duomenų siunčiamų internete, todėl svarbu tose antraštėse nurodyti, kad bus naudojama UTF8 koduotė.
 
[[Kategorija:Straipsniai]]
 
[[Kategorija:Straipsniai]]

13:37, 28 spalio 2009 versija

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, ataskayti 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ę

Pagrine čia sunkumų kyla 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 laisvai 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 duomenus bus rikiuojami, pvz ORDER BY atveju). Pavyzdžiui "lithuanian" reiškia, kad rikiuojant bus taikomos lietuvių kalbos taisyklės, ir tokios taidė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žiosis ir mažosios raidės interpretuojamos, kaip skirtingos.

"bin" reiškia, kad naudojama binarinė koduotė, kur visi dimboliai interpretuojami individualiai. "bin" praktiškai apjungia du punktus - tiek rikiavimo nustatymą tiek didžiųjų/mažųjų raidžių nustatymą.

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

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ė.