Tutorial : php, mysql i hr znakovi

Vec dulje vremana obecajem ljudima da cu se dotaknuti
problematike hrvatskih slova u kombou php + mysql pa eto…

za ovaj tutorail na lokalnoj masini radim sa
wamp 1.7.0 (mysql 5.0.22, php 5.2.3), a na serverskoj
strani na kojoj ovi primjeri takodjer rade baza je
mysql 4.1.22 a php 4.4.4. tako da mislim da bi ovo
trebalo raditi sa svim php i mysql verzijama od 4
nadalje…

Korak 1 - natjerati mysql bazu da govori hrvatski :

Vecina beza na ovim prostorima ima defaltnu postavku
Collation - >latin1_swedish_ci.
Sto to znaci. to znaci da ako u bazu probate napraviti
insert podatka : “cvijeće” zapis ce izgledati ovako :
“cvije?e”…

Stvar popravljamo tako da u postavkama “operations”
(najlakse je do njih doci preko phpMyAdmin)
varijablu “Collation” postavite u "latin2_croatian_ci"
Bitno je da kompletna baza bude postavljena na hrvatski,
a ne samo tablice! ponekad je potrebno dropati tablice,
i kreirati nove sa odgovarajucim Collationom.
Ako ste sve dobro napravili, insert podataka “cvijeće” u bazi
zgleda ovako : “cvijeće”.

Prvi korak je uspjesno izveden :slight_smile:

Korak 2 - natjerati HTML/PHP stranice da govore hrvatski

da bi se HTML stranice prebacile ha hrvatski encoding
u zaglavlje stranice je potrebno dodati (ili promjeniti postojeci)
tag u:

[HTML][/HTML]

ukoliko ste uspjesno promjenili encoding stranice, za ulaz :

[HTML]/*
ovdje ide kod koji u variablu : $variabla_iz_baze
stavlja sadržaj sloga u koji smo u koraku 1 zapisali
"Cvijeće".
*/

Cvijeće

<? echo ("Cvijeće"); ?>

<? echo ("$variabla_iz_baze"); ?>

[/HTML]

bi trebali dobiti izlaz sličan ovome :

Cvijeće
Cvijeće
Cvije?e

Korak 3 : Like… ok i kaj sad?

E sad vi kazete, “pa neko tu nekoga nekaj!” :slight_smile:
a ja jos tvrdim da smo na dobrom putu :slight_smile:

sad idemo probati upisati u bazu podatke koje smo unjeli u textbox
na nasoj php stranici :

ako zavirite u bazu, vidjet cete da nase “Cvijeće” sad u bazi
izgleda ovako : “Cvije& #263;e”, i vjerovali ili ne, to je tocno
ono sto mi zelimo.

ako ovaj put probate ispisati :

rezultat ce biti tocan : “Cvijeće”.

Znaci baza prima točne rezultate za unos i za ispis, i u bazu
pohranjuje sa kodovima za posebne znakove, a posto je nama oblik
zapisa o bazi totalno nevazan (zbog transparentnosti baznog djela
aplikacije) ovo rjesenje je vise nego elegantno.

Korak 4 : Pretrazivanje

I regularno petraživanje i fulltext search s ovom metodom mi radi savrseno.

Korak 5 : Sortiranje

Sortiranje za sad ne radi kak spada ni sa normalnim oblikom hrvatskoh znakova
ni sa posebnim znakovima, tak da se to treba rjesiti na nivou baze…

eto tolko od mene…
ako sam nekome pomogao, drago mi je,ak ne opet dobro. :stuck_out_tongue:
sve nejasnoce postajte tu.

Goran

malo kasniš… UTF8 je budućnost i sadašnjost, nikakvi latin…

latin je naveden kao primer zato jer UTF8_croatian u vidu
mysql-a ne jos postoji (makar UTF8_bin podrzava sve hrvatske znakove).

U svakom slucaju hvala na primjedbi. :wink:

Ma to je komplicirano. I, usput, zašto je kao encoding stranice naveden onaj koji po standardu NE podržava hrvatske znakove (iso-8859-1)? To znači da svaki hrvatski znak treba izmijeniti u ekvivalentni html kod, što je, bar meni, prekomplicirano. :slight_smile:

Još nešto, zaboravio si napomenuti da editor u kojem radiš stranicu mora spremiti stranicu u istom encodingu koji je i na stranici naveden.

UTF8 staviš na sve i nemaš problema.

Like… ne! :slight_smile:

poanta svega je da stranica izgenerira
te kodove za hrvatska slova, da bi se ta ista
slova poslje kroz php mogla prikazivati, pretrazivati
i sortirati.

Sto se tice ekvivalentnih slova i html kodu to zavisi od
sustava do sustava. ja na svojim dinamickim stranicama
nikad nemam nikakva slova “hardkodirana” u sam html.
(sve vucem iz baze ili language fajla) tako da mi ovo
vise odgovara.

Cinjenica je da su ljudi imali masu problema sto se tice
problematike nasih slova i da je jedno od cestih rjesenja
pisanje skripti koje pretvaraju hrvatska slova u kodove.

Ovo je samo jedno od mnogih rjesenja koje omogucuje
hrvatska slova u dinamickom sadrzaju iz baze, no ipak je
jedno od rijetkih koje omogucava neke metode u stilu
fulltext searcha (zbog kojeg sam i krenuo na ovu metodu).

eto :zbogom:

Predlažem da moderator ovo stavi kao sticky. Tko ima kakvo drugačije rješenje koje (a) funkcionira i (b) autor ga je u stanju objasniti u koracima kako je pokazano u prvom postu , neka ga dopiše ovdje.

@tsereg - pa nisi ti moderator? i jos to super? :smiley:

Ja sam to sve napravio sam utf8_unicode (kod baze ono cistam zadnje u phpmyadminu, kad se radi baza i tablica) i sve radi super. ne kažem to sam ja, nego i programer webmajstora tak da sam u pravu. :smiley: :slight_smile:

Ima puno načina da se riješi problem hr znakova. Jedno rješenje koje mi se u početku činilo glupo je zapravo i najkvalitetnije jer je utf-8 zato i izmišljen da razumije sve znakove na svijetu 2^8 znakova. Glupo mi se činilo zato jer je u bazi “šečer” zapisan kao cca: “%s!ecSer”. Ako sagledate da ja nemam apsolutno nikakve veze sa generiranjem UTF ekvivalenata čšđžć već to PHP i MySQL sami rade onda ne vidim problem ovakvog rješenja. Ispod su vam stvari na koje morate paziti:

  1. u HTML dokumentu charset mora biti:
  1. MySQL Tablica mora biti:
    CREATE TABLE ime_tablice
    {
    atributi, atributi…
    }ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=utf8;

  2. Stvar koji mnogi ne skuže je da PHP skripta koja obrađuje tekst i upisuje ga u MySql bazu (koja je UTF-8) mora biti sačuvana u UTF formatu. Znači, kada piušete .php skriptu u nekom PHP editoru, u FILE->FILE FORMAT izaberite UTF without BOM.

[quote=“gandolfini”]3. Stvar koji mnogi ne skuže je da PHP skripta koja obrađuje tekst i upisuje ga u MySql bazu (koja je UTF-8) mora biti sačuvana u UTF formatu. Znači, kada piušete .php skriptu u nekom PHP editoru, u FILE->FILE FORMAT izaberite UTF without BOM.[/quote]Možda mala razrada ovog navoda. Skripta, kao takva, načelno ne bi trebala imati veze. Međutim, PHP skripte obično sadrže i HTML kod, koji će onda nvj. biti u slovnom skupu UTF-8 (pa time i cijela .php datoteka, pa će time i META oznaka za Content-Type indicirati isto). Također, ako se u programskom dijelu skripte nalaze literarne vrijednosti stringova (konstante) koje će biti pohranjene u bazu podataka, one bi nvj. trebali biti kodirane kao UTF-8 (pod pretpostavkom da ne postoji neka mogućnost da se MySQL-u ili kakvom sloju između naloži automatska pretvorba).

Zgodno je znati i slijedeće o slovnom skupu UTF-8:

  1. Prvih 128 znakova slovnog skupa UTF-8 su dugački 1 bajt i isti kao prvih 128 znakova slovnog skupa ASCII.
  2. Ostali znakovi slovnog skupa mogu biti kodirani s 2 do 4 bajta. Zbog toga, općenito, ne možemo procjenjivati broj slova temeljem duljine u bajtovima (ili obratno). Naša slova su kodirana s dva bajta.

Naveo si par stvari i meni nepoznatih do danas…

Hvala :slight_smile:

Stavio sam u bazi utf8_bin, svako polje utf8_bin u html-u:

I neće da mi prikazuje slova sa kvakicama, prikazuje mi “?”, dok u drugom fajlu hoće (a taj drugi inace includam u index.php ono ?sta=nesto …)

I tamo ne odredjujem charset. Šta bi moglo biti problem?? to na locahostu neće, a na serveru mi hoće sva osim “ž”, dok u onom fajlu drugom hoće sva (što se tiče servera)

Znači

Localhost:

  • neće ni jedno na naslovnoj (kategorije)
  • hoće u onom jednom fajlu kod čitanja iz baze

Server:

  • hoće sva osim “ž” kod čitanja iz baze (kategorije)
  • hoće sva u jednom fajlu kod čitanja iz baze.

Je li AJAX u igri? Ako je, u server-side dijelu moraš headerom definirati slovni skup.

Usto, ovo si vidio?

Nije AJAX zasad. Ne mogu da nađem to u Dreamweaveru. Btw. meni prikazuje normalno slova, ali link zato izgleda kao upitnik.

U Dreamweaveru je to CTRL+J -> Title/Encoding -> Encoding.

Naštimano je na UTF-8. Btw. na serveru mi radi, dok na localhostu ne, bitnije je na serveru, ali nervira me, da mi je rješit ovo.

Evo napravio sam. Nešto je pogrešno bilo kod replacea, kopirao sam ono što sam na server stavio vamo i na localhost… vjerovatno je do koda nešto bilo. U svakom slučaju hvala!! :slight_smile:

Evo ja sam sve postavio na utf8_unicode_ci. I sve radi ko podmazano :slight_smile:

Jedino mi ovo nije jasno. Kad exportam bazu u .sql umjesto hrvatskih slova vidim neke čudne simbole, ali kad tu istu bazu importam sve funkcionira. na sajtu se pojavljuju normalna hrvatska đšžćžč slova. je li to normalno?

Ako sve radi, uredu je. Možda text editor u kojem pregledavaš SQL datoteku nije namješten na odgovarajući encoding.

Da se nadovežem na prvi post i drugi i treći i ( nije mi se dalo gledat koliko još )

Sajt

[HTML][/HTML]

baza

utf8_unicode_ci ili utf8_bin

Radi ajax radi sajt radi mysql radi sve sa hrvatskim znakovima. A i češkim što se mene mysql-a html-a i ajax-a tiče :smiley:

latin_ nebi ja to :smiley:

Bavim se ovim problemom sa kodiranjem hrvatskih znakova već par dana i zaključio sam da je dosta dobra ova “latin_croatian” metoda. Sva se slova na sajtu uredno prikazuju, u bazi nema nekih sje?anih simbola. Istina je da su hrvatska dijakritička slova kodirana kao kombinacija nekih slova i brojeva…

(1, 'wmessage', 1145848343, 1, '', 0, 'cvijece Cvijeće &#-273;šž&#-263;&#2-69;');
morao sam staviti ove crtice (-) da mi prikaže kod

… ali to mi ne smeta…

Što se tiče ovog utf8_bin-a - totalno čudno! Što će mi tekst u binarnom zapisu? :slight_smile:

A ovaj utf8_unicode mi izbacuje neka čudna slova umjesto đšžćč … ipak mi je latin bolji… :slight_smile:

Kako kome paše… neka tako stavi… :slight_smile: