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.

junij 4th, 2008 ob 9:44 dopoldne
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.
junij 4th, 2008 ob 10:04 dopoldne
Je možno z function overload, vendar ni priporočljivo.
P.S: Hvala za popravek.
junij 4th, 2008 ob 5:57 popoldne
Bomo pač malo lenobe premagal, pa tisti mb_ pisal
junij 4th, 2008 ob 6:08 popoldne
Napiši skripto, ki ti gre čez vse datoteke in vse te funkcije nadomesti s mb_
junij 4th, 2008 ob 8:16 popoldne
Zakaj se jaz nisem takoj tega spomnil
Hvala vsekakor za vse članke in za predlog! 
junij 5th, 2008 ob 3:42 popoldne
Ni problema:) ... hvala za oglede in komentarje:P
junij 12th, 2008 ob 1:21 popoldne
Zanimiv blog, dobri nasveti:).
Kr tako naprej, velikokrat pride prav ce kje preberes kakšen nasvet pa da si ne razbijaš glave po nepotrebnem :).
junij 12th, 2008 ob 7:14 popoldne
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:)