PHP - delo z UTF-8 stringi oz. podatki - težave s šumniki (č,š,ž)
Veliko PHP aplikacij se zadnje čase popravlja in dodaja UTF-8 podporo. Še več ljudi se že ob začetku gradnje aplikacije odloči za UTF-8 podporo. Žal PHP5 celostno še ne podpira UTF-8 stringe oz. delo z njimi out of the box (native), vendar Multibyte String Functions zadevo močno olajšajo. Še bolje bo pri PHP6.
Na blogu smo že obdelali standardne napake, ki se lahko pojavijo pri gradnji PHP aplikacije oz. spletne strani z UTF-8 podoro:
- UTF-8 tabele, vendar latin1 podatki ter povezava
- Šumniki - UTF-8 - Težave - PHP & MySQL
- PHP - pretvori prvo črko v veliko črko - UTF8 podpora (ucfirst, ucwords, mb_convert_case)
- Uporabni HTML meta tagi - PHP header
S sledečimi vodiči pokrijemo večino težav in imamo delujoče sledeče stvari oz. dele PHP aplikacije:
- Podatkovna baza z UTF-8 podporo ter UTF-8 podatki
- PHP povezavo do MySQL baze, ki uporablja UTF-8 kodno tabelo
- PHP nastavitev za header, ki brskalniku sporoči, da izpisujemo UTF-8 podatke
Sedaj moramo biti le še pozorni pri obdelavi UTF-8 stringov oz. teksta s strani PHP-ja. Kot že rečeno se v ta namen uporabljajo Multibyte String funkcije. Za pravilno delovanje Multibyte funkcij potrebujete dodaten PHP modul, ki se imenuje mbstring extension (php_mbstring.dll). Več o namestitvi najdete na PHP.net strani. Priporočam vam tudi ogled nastavitev, kjer so tudi primeri konfiguracije.
Ko vam modul deluje lahko namesto običajnih PHP funkcij za delo s stringi uporabljamo sledeče funkcije:
- mail => mb_send_mail
- strlen => mb_strlen
- strpos => mb_strpos
- strrpos => mb_strrpos
- substr => mb_substr
- strtolower => mb_strtolower
- strtoupper => mb_strtoupper
- substr_count => mb_substr_count
- ereg => mb_ereg
- eregi => mb_eregi
- ereg_replace => mb_ereg_replace
- eregi_replace => mb_eregi_replace
- split => mb_split
Standardne funkcije, kjer je potrebno kot string $charset parameter dodati UTF-8:
Nekaj kopiranih funkcij z UTF-8 podporo:
Pošiljanje emailov:
Pri uporabi že spisanih modulov za pošiljanje e-pošte nastavite pravilni charset (primer težave in rešitve za Outlook Express - HTML Mime Mail PHP).
Array funkcije znajo pravilno sortirati UTF-8 znake, če pravilno nastavimo locale nastavitev:
Seznam držav oz. kode le-teh, ki jih lahko uporabite na vašem strežniku pri setlocale funkciji.
Pretvorba podatkov:
Za pretvorbo podatkov lahko uporabljate mb_convert_encoding oz. iconv funkciji. Pri pretvori bodite pozorni, da že obstoječ UTF-8 string ne pretvarjate ponovno v UTF-8, naprimer:
-
-
// Only convert if ISO-8859-1 / CP1250
-
if ($encoding == "ISO-8859-1") {
-
}
Bodite pozorni tudi na BOM znak na začetku datotek, primer:
-
// If there is BOM char at the begining, clear it
-
}
Kratek povezetek:
Zapomnite si, pomembno je, da imate UTF-8 podatke v bazi (pretvorba le-teh), PHP povezavo do MySQL, ki uporablja UTF-8 kodno tabelo (Query: SET NAMES UTF8) ter pravilno nastavitev za brskalnik (header('Content-Type: text/html; charset=utf-8').
Dodatne informacije:
- Seznam PHP funkcij kjer lahko pride do težav z UTF-8 stringi
- Preverite pravilnost vašega UTF-8 stringa
- Upravljanje z UTF-8 stringi - nekaj dodatne vsebine
Imate tudi vi kakšne težave pri delu z UTF-8 podatki? Sporočite pod komentarje.

June 4th, 2008 ob 9:44 am
Bi te samo popravil pri setlocale funkciji je 'sl_SI', ne 'si_SI'
Me pa zanima če je možno definirat funkcijo recimo:
function mail(...) {
return mb_send_mail(...);
}
Trenutno nisem čist zihr.
June 4th, 2008 ob 10:04 am
Je možno z function overload, vendar ni priporočljivo.
P.S: Hvala za popravek.
June 4th, 2008 ob 5:57 pm
Bomo pač malo lenobe premagal, pa tisti mb_ pisal
June 4th, 2008 ob 6:08 pm
Napiši skripto, ki ti gre čez vse datoteke in vse te funkcije nadomesti s mb_
June 4th, 2008 ob 8:16 pm
Zakaj se jaz nisem takoj tega spomnil
Hvala vsekakor za vse članke in za predlog!
June 5th, 2008 ob 3:42 pm
Ni problema:) ... hvala za oglede in komentarje:P
June 12th, 2008 ob 1:21 pm
Zanimiv blog, dobri nasveti:).
Kr tako naprej, velikokrat pride prav ce kje preberes kakšen nasvet pa da si ne razbijaš glave po nepotrebnem :).
June 12th, 2008 ob 7:14 pm
Ja, tudi meni velikokrat pride prav da imam na blogu že vse pripravljeno za določeno temo in potem samo kopiram. Hvala za pohvale, upam da nas bo skozi več tukaj:)
December 7th, 2008 ob 4:35 pm
Zakaj pa meni noče shranit v bazo šumnikov shranjujem jih pa z htmlentities...
$naslov_navigacija = htmlentities($_POST['naslov_navigacija']);
$vsebina = htmlentities($_POST['vsebina']);
December 8th, 2008 ob 9:09 am
htmlentities('čšž testni string', ENT_QUOTES, 'UTF-8') ;
Takole uporabi, torej še UTF-8 na koncu.
December 8th, 2008 ob 11:25 am
V bazo doda samo č žja in šja pa ne prebavi :S
December 8th, 2008 ob 12:38 pm
si dal set names utf8 z mysql?
December 8th, 2008 ob 12:55 pm
Kako to misliš? V bazi je nastavljeno na utf8_ci ne vpiše mi pa šumnikov ž,š..
December 8th, 2008 ob 1:51 pm
Poglej si še ostale vodiče glede povezave:
http://trsplet.com/blog/2008/03/21/sumniki-utf-8-tezave-php-mysql/
Probaj shranit v bazo brez htmlentities in boš videl, če ti htmlentities povzroća težave ali je že kje drugje problem.
December 8th, 2008 ob 5:35 pm
Nep brez tega mi pa niti č ne stavi v bazo.
December 8th, 2008 ob 5:37 pm
samo to sem stavil pa stvar deluje
hvala za pomoč.
December 8th, 2008 ob 5:51 pm
oziroma ne...
meta http-equiv=Content-Type content=text/html;charset=utf-8
če uporabim tako šumnike pravilno vpiše v bazo in vse samo pa potem na strani ne prikaže šumnikov iz baze jih pa prebere pravilno..
December 26th, 2008 ob 9:34 pm
je kakšen problem s šumniki, če uporabljam na strani charset windows-1250, v bazi pa utf8_slovenian_ci? ... vnos in izpis sta normalna, le da je v bazi zapisan é namesto č ...
December 27th, 2008 ob 11:24 am
Niti ne, samo podatki v bazi potem dejansko niso UTF8 ampak windows-1250. Če boš kdaj delal prenovo in se odločil za dejanski UTF-8 potem boš moral prekonvertirati.