PDA

View Full Version : Tutorial : php, mysql i hr znakovi


teddybeer
14-06-2007, 03:20
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 :)

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:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">


ukoliko ste uspjesno promjenili encoding stranice, za ulaz :


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

<p>Cvijeće</p><br>
<p><? echo ("Cvijeće"); ?></p><br>
<p><? echo ("$variabla_iz_baze"); ?></p>

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!" :)
a ja jos tvrdim da smo na dobrom putu :)

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

mysql_connect(SQLHOST,SQLUSER,SQLPASS);
mysql_select_db(SQLDB)
$query = "INSERT INTO `$tablica` ('id','tekst') VALUES ('100','$_POST['textbox']');";
mysql_query($query)

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 :

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

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. :P
sve nejasnoce postajte tu.

Goran

Ibiza
14-06-2007, 03:30
malo kasniš... UTF8 je budućnost i sadašnjost, nikakvi latin...

teddybeer
14-06-2007, 03:49
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. ;)

franzi
14-06-2007, 11:17
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. :)

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.

teddybeer
14-06-2007, 11:33
Like... ne! :)

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:

tsereg
14-06-2007, 12:53
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.

Gosarić
14-06-2007, 14:29
@tsereg - pa nisi ti moderator? i jos to super? :D

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. :D :)

gandolfini
25-08-2007, 14:16
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:
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

2. MySQL Tablica mora biti:
CREATE TABLE ime_tablice
{
atributi, atributi...
}ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=utf8;

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.

tsereg
25-08-2007, 14:38
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.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.
- Više informacija: http://en.wikipedia.org/wiki/UTF-8

gandolfini
25-08-2007, 14:48
Naveo si par stvari i meni nepoznatih do danas...

Hvala :)

Critical
02-02-2008, 23:44
Stavio sam u bazi utf8_bin, svako polje utf8_bin u html-u:

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

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.

franzi
03-02-2008, 00:00
Je li AJAX u igri? Ako je, u server-side dijelu moraš headerom definirati slovni skup.

Usto, ovo si vidio?
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.

Critical
03-02-2008, 11:45
Nije AJAX zasad. Ne mogu da nađem to u Dreamweaveru. Btw. meni prikazuje normalno slova, ali link zato izgleda kao upitnik.

franzi
03-02-2008, 11:51
Ne mogu da nađem to u Dreamweaveru.

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

Critical
03-02-2008, 11:54
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.

Critical
03-02-2008, 12:09
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!! :)

marino
07-02-2008, 22:20
Evo ja sam sve postavio na utf8_unicode_ci. I sve radi ko podmazano :)

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?

franzi
07-02-2008, 22:30
Ako sve radi, uredu je. Možda text editor u kojem pregledavaš SQL datoteku nije namješten na odgovarajući encoding.

UntitleD
08-02-2008, 06:42
Da se nadovežem na prvi post i drugi i treći i ( nije mi se dalo gledat koliko još )

Sajt

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

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 :D

latin_ nebi ja to :D

marino
08-02-2008, 15:17
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;-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? :)

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

Kako kome paše.. neka tako stavi.. :)

dadaas
29-12-2008, 17:54
evo i aj se jos jednom mucim s ovim slovima, koja mrzim iz dna duse, jedva cekam dan kad cemo ta slvoa izbacit iz naseg jezika.

Problem:
Konvertirao sam databasu tak da mi radi, dakle upisao sam ŠĐŽĆČ slova u databasu i njezino čitanje radi, kada je <meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
E sad, onda ne rade slova koja se citaju s language filea.

A ako convertiram cjelu databasu u UTF-8 onda mi ne radi slovo Š, naravno ako i <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Al onda language file radi.

Ima tko kakvu ideju, imam 4.1.22 mysql

Cjeli dan sam izgubio na ovom sranju i još nisam rjesio.

tutorial
29-12-2008, 18:18
Neka ti charset baze bude utf-8, jednako kao i uspoređivanje - kasnije još zasebno prekontroliraj svaku tablicu. Datoteke spremi s charsetom utf-8 bez BOM. Neka ti meta tag ima isti charset kao i baza. To je ukratko to, trebalo bi raditi.

dadaas
29-12-2008, 18:28
Datoteke spremi s charsetom utf-8 bez BOM
Kaj je BOM?
Kak se to slozi?

Ok database character i collation promjenim tak da dumpam database i editiram s gphpedit latin1 u utf8 i onda mi je charset utf8 i collation je utf_general_ci

jel to to?

dadaas
29-12-2008, 18:37
evo podesio sam sve tak.
Neznam gdje bih mogao pogrjesiti, sve je utf-8 i sada language file buduci sam meta stavio utf-8 radi a podaci povuceni iz database nerae, umjesto Рimamk ���������������.
A kad ubacim iso-8859-1 u meta tag onda je database podaci povuceni uredu ali je language file sjeban totalka, niejdno anse slovo ne radi.

Pa sad mi molim vas pomozite.

tutorial
29-12-2008, 18:39
Collation isto postavi na utf-8.

BOM (http://en.wikipedia.org/wiki/Byte-order_mark) je skraćenica za byte-order mark. Ako imaš Notepad++ odaberi Format i onda ANSI i Kodiraj u UTF-8 (bez BOM). Ako ne koristiš Notepad++, probaj pronaći sličnu opciju u programu kojega koristiš.

dadaas
29-12-2008, 19:46
evo rijesio sam, pa da pomognem svima sljedecima koji ce se jebat s ovim.

Ovako, postoje 3 fore, upisivanje, pohrana, citanje.

E mene je jebalo vec od pocetka samog, prvi korak, upisivanje, a da bi upisali kak treba onda vam treba prije mysql querya stavit nesto kao:
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET NAMES 'utf8'");

Pohranu su decki vec obradili ovdje, znaci databasu na charset utf8 i collation preporucam utf8_general_ci

A citac meta tag postavite na utf-8

voila radi.

Inace sam vec jednom ovo radio(zamislite ironij) trebalo mi 5 sati da se sjetim da sam vec jednom imao ovaj problem, sad sam ga ovdje objasnio pa kad jos jednom zeznem dodjem ovdje i prisjetim se.

@tutorial: koristim gphpedit, valjda taj programcic vec ima taj BOM

mamica
29-12-2008, 20:51
Dajte si zericu truda i pretražujte WM s vremena na vrijeme :|

http://www.webmajstori.net/forum/showthread.php?t=19547