logo

INTERNETNE STORITVE

- IZDELAVA SPLETNIH STRANI - OBLIKOVANJE - PROGRAMIRANJE DODATKOV

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:

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:

PHP:
  1. htmlentities('čšž testni string', ENT_QUOTES, 'UTF-8') ;
  2. html_entity_decode('čšž testni string', ENT_QUOTES, 'UTF-8') ;
  3. htmlspecialchars('čšž testni string', ENT_QUOTES, '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:

PHP:
  1. setlocale (LC_ALL, 'sl_SI.UTF-8');

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:

PHP:
  1. $encoding = mb_detect_encoding($test, "UTF-8, ISO-8859-1");
  2.  
  3. // Only convert if ISO-8859-1 / CP1250
  4. if ($encoding == "ISO-8859-1") {
  5.     $test = iconv("CP1250", "UTF-8", $test);
  6. }

Bodite pozorni tudi na BOM znak na začetku datotek, primer:

PHP:
  1. // If there is BOM char at the begining, clear it
  2. if (strpos($test, "\xEF\xBB\xBF") !== false) {
  3.     $test = str_replace("\xEF\xBB\xBF", "", $test);
  4. }

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:

Imate tudi vi kakšne težave pri delu z UTF-8 podatki? Sporočite pod komentarje.

19x komentirano na “PHP - delo z UTF-8 stringi oz. podatki - težave s šumniki (č,š,ž)”

  1. smottt je napisal:

    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.

  2. Roky je napisal:

    Je možno z function overload, vendar ni priporočljivo.

    P.S: Hvala za popravek.

  3. smottt je napisal:

    Bomo pač malo lenobe premagal, pa tisti mb_ pisal :)

  4. Roky je napisal:

    Napiši skripto, ki ti gre čez vse datoteke in vse te funkcije nadomesti s mb_

  5. smottt je napisal:

    Zakaj se jaz nisem takoj tega spomnil :D Hvala vsekakor za vse članke in za predlog! ;)

  6. Roky je napisal:

    Ni problema:) ... hvala za oglede in komentarje:P

  7. Milch je napisal:

    Zanimiv blog, dobri nasveti:).
    Kr tako naprej, velikokrat pride prav ce kje preberes kakšen nasvet pa da si ne razbijaš glave po nepotrebnem :).

  8. Roky je napisal:

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

  9. Cobra je napisal:

    Zakaj pa meni noče shranit v bazo šumnikov shranjujem jih pa z htmlentities...

    $naslov_navigacija = htmlentities($_POST['naslov_navigacija']);
    $vsebina = htmlentities($_POST['vsebina']);

  10. Roky je napisal:

    htmlentities('čšž testni string', ENT_QUOTES, 'UTF-8') ;

    Takole uporabi, torej še UTF-8 na koncu.

  11. Cobra je napisal:

    V bazo doda samo č žja in šja pa ne prebavi :S

  12. Roky je napisal:

    si dal set names utf8 z mysql?

  13. Cobra je napisal:

    Kako to misliš? V bazi je nastavljeno na utf8_ci ne vpiše mi pa šumnikov ž,š..

  14. Roky je napisal:

    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.

  15. Cobra je napisal:

    Nep brez tega mi pa niti č ne stavi v bazo.

  16. Cobra je napisal:

    samo to sem stavil pa stvar deluje ;) hvala za pomoč.

  17. Cobra je napisal:

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

  18. schtr4jh je napisal:

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

  19. Roky je napisal:

    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.

Dodaj komentar