T&R splet blog o spletnih storitvah. Razgaljamo tehnologijo!

reference spletnih strani
21st March

Šumniki – UTF-8 – Težave – PHP & MySQL

Vse več spletnih strani prehaja iz latin1 (oz. ISO-8859-1) na UTF-8 kodni sistem oz. character set. Posledično je sedaj vprašanj s tem toliko več. Poglejmo si celoten proces, ki bo spletno stran iz ISO-8859-1(latin1) spremenil v UTF-8 kodni sistem:

#1 IDE
Nastavljen UTF-8 encoding v Zend Studio programu. Vse trenutne datoteke (sploh datoteke, ki vsebujejo prevode je treba shraniti v UTF-8 in popraviti težave s šumniki.

#2 BOM
Problemi in rešitve za BOM znak na začetku datoteke.

#3 PHP Header na začetku (prve) skripte

PHP:
  1. PHP header('Content-Type: text/html; charset=utf-8');

#4 HTML meta content-type

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

#5 PHP encoding MySQL povezave

MySQL:
  1. "SET NAMES 'utf8' COLLATE 'utf8_slovenian_ci'"

#6 Podatki v bazi morajo biti v UTF-8
Več informacij in konvertiranje podatkov iz latin1 v UTF-8. Struktura tabel ter baze mora ravno tako biti UTF-8, primer:

MySQL:
  1. CREATE TABLE `utf8tabela` (
  2. `utf8poljevarchar` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_slovenian_ci,
  3. `utf8poljetext` TEXT CHARACTER SET utf8 COLLATE utf8_slovenian_ci
  4. ) CHARACTER SET utf8 COLLATE utf8_slovenian_ci;

Uporabno:
#1 PHP Sortiranje UTF-8 podatkov v tabeli (array):

PHP:
  1. setlocale (LC_ALL, 'sl_SI.UTF-8'); // po tem PHP ve, da je Č za C (drugače ga sortira kot zadnji znak in je na koncu tabele)
  2. $array = array("c", "č", "s", "š", "z", "ž");
  3. usort ($array, 'strcoll');

strcoll() uses the current locale for doing the comparisons. If the current locale is C or POSIX, this function is equivalent to strcmp().

#2 Popravljanje č,š,ž,Č,Š,Ž
Ena možnost je, da vse šumnike nadomestite s (predno spremenite encoding datoteke v UTF-8):

  • č - Č || Č - č
  • ž - Ž || Ž - ž
  • š - Š || Š - š

... saj boste v nasprotnem primeru, ko boste datoteko shranili in ponovno prebrali v UTF-8 namesto šumnikov dobili ???.

#3 Delo s stringi v PHP
Ko imate enkrat vse podatke v UTF-8 morate v PHP-ju za stringe uporabljati mb_xyz funkcije. Nekaj primerov:

  • mb_strtoupper("tole je č š ž Č Š Ž test", "UTF-8"); // spreminjanje v velike črke
  • mb_convert_encoding("tole je č š ž Č Š Ž test", "UTF-8", "ISO-8859-1"); // konvertiranje iz ISO-8859-1 v UTF-8

Dodatne informacije:

Blogi:

Deli s skupnostjo:

  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

Podobni članki:

  1. Stalni UTF-8 problemi – utf8 mysql php – čšž šumniki težave – iskanje znaki – mysql like
  2. PHP – delo z UTF-8 stringi oz. podatki – težave s šumniki (č,š,ž)
  3. Windows – lokalni MySQL uvoz podatkovne baze – velika podatkovna baza – težave pri uvozu velikih MySQL baz
  4. UTF-8 tabele, vendar latin1 podatki ter povezava
  5. Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8
  6. Zen Cart – UTF-8 podpora – pretvorba
  7. MySQL kreiranje tabele s SELECT stavkom
  8. Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)
  9. Zend Search Lucene – UTF8 podpora – iconv težave
  10. MySQL iskanje LIKE vs FULL-TEXT

25x komentirano na “Šumniki – UTF-8 – Težave – PHP & MySQL”

  1. zaxy je napisal:

    samo en podatek... notepad++ brez problema shranjuje v UTF 8 without BOM. Vsaj najnovejše različice. Za nazaj pa se ne spomnem ravno. Vem pa, da so se nekateri pritoževali, da notepad++ shranjuje z BOM.

  2. Roky je napisal:

    Aha, možno, vem da so imeli nekateri težave s tem pa sem hotel izpostavit, da je to eden izmed možnih problemov.

  3. Mesko je napisal:

    Notepad++ je imel ja težavo szi shranjevanjem UTF-8, vendar je odpravljena ;) Uporabljam Notepad++ od vsega začetka pa še nisem imel problemov s šumniki in BOMom. Sem pa probal ZendStudio in Eclipse, vendar mi nista ravno všeč ...

  4. Roky je napisal:

    Jest sem zaenkrat na ZendStudio, mi je še najbolj všeč, le debug se moram še spravit uporabljat:P

  5. ace je napisal:

    6. točka ni ravno resnična. MySQL zna pretvarjati med charseti, tako da je čisto vseeno v katerem charsetu je sama baza.

  6. Roky je napisal:

    Zna pretvarjati, ampak če uporabljaš povsod UTF-8 (kar je bil pri tem članku cilj, da spravmo is latin1 v utf-u), potem je fajn če je tudi baza UTF-8.

    Se pa strinjam, da zna pretvarjati in da je to tudi opcija (CAST, CONVERT).

  7. ace je napisal:

    Roky> pri pretvorbi sem mislil situacijo, ko imaš bazo v recimo latin2 in preprosto narediš samo SET NAMES utf8 na nivoju query-ev pa potem delaš z bazo kot da je utf8.

  8. Roky je napisal:

    Pa si ziher, da ORDER BY 'cčsšzžČŠŽĐĆ' dela pravilno ko so multi-byte characterji?

  9. ace je napisal:

    Seveda deluje. Sicer sem v praksi rabil do zdaj le omenjeni primer, ko je baza v latin2 vse ostalo pa utf8, ampak mislim, da na isti način deluje tudi z ostalimi charseti.

  10. Roky je napisal:

    Zdi se mi ekstra čudno za ta ORDER BY, tukaj je recimo podoben razložen:

    http://www.onphp5.com/article/6

    Quote: The problem with these defaults is that they cannot be used to sort non-English strings. Our solution is to use Unicode, or, more specifically, the UTF-8 character set.

    ... nisem pa sam probal, tko da težko trdim kaj je res in kaj ne.

  11. ace je napisal:

    Kaj pa vem, tale post je več kot 1 leto star. V tem času so tudi na MySQL-u že kaj ukrenili.
    Skratka, garantiram ti da ko latin šumnike iz baze bereš preko SET NAMES utf8 je Č takoj za Cjem, Š za Sjem in Ž za Zjem. :)

  12. Roky je napisal:

    Če je tako, ti verjamem. Zanimiva rešitev in en info več:P

  13. Iskalni rezultati - statistika - Google Analytic - trsplet | .: TRSplet - internetne storitve .: je napisal:

    [...] UTF-8 - šumniki - čšž [...]

  14. Uporabni HTML meta tagi - PHP header | .: TRSplet - internetne storitve .: je napisal:

    [...] Šumniki - UTF-8 - Težave - PHP & MySQL [...]

  15. Zen Cart - UTF-8 podpora - pretvorba | .: TRSplet - internetne storitve .: je napisal:

    [...] V database objektu moramo dodati query, ki nastavi UTF-8 povezavo med MySQL in PHP [...]

  16. PHP - delo z UTF-8 stringi oz. podatki - težave s šumniki (č,š,ž) | .: TRSplet - internetne storitve .: je napisal:

    [...] Šumniki - UTF-8 - Težave - PHP & MySQL [...]

  17. PHP - pretvorba Excel datoteke v .txt datoteko - Excel to txt converter | .: TRSplet - internetne storitve .: je napisal:

    [...] Drugače boste dobivali zelo čudne napake / rezultate. Več o teh težavah povezanih z BOM znakom. [...]

  18. Tit Petric je napisal:

    Carsko, 10 let zakopan v php pa šele zdajle slišim za strcoll :) ... ah ja, tko je, k mysql deluje!

    Hvala! LP

  19. Roky je napisal:

    Vsak dan nekaj novega:) Me veseli ...

  20. Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8 | .: TRSplet - internetne storitve :. je napisal:

    [...] 3.) Zaženite http://vasa_domena.si/utf8convert.php 4.) Sledite navodilom kako vašo spletno stran pre-konvertirati v UTF-8 način [...]

  21. Stalni UTF-8 problemi – utf8 mysql php – čšž šumniki težave – iskanje znaki | .: TRSplet - internetne storitve :. je napisal:

    [...] s UTF-8 podporo. Blog iskalnik nam za UTF-8 iskalni niz vrne, kar nekaj rezultatov. Obdelali smo 6 korakov kako do UTF-8 podpore na vaši spletni strani, napisali vodič kako dodati UTF-8 podporo aplikacijam kot je Zen Cart, [...]

  22. Domen je napisal:

    Živjo,

    če slučajno, še komu ne dela pravilno sortiranje usort ($array, 'strcoll');, potem lahko uporabi sledečo rešitev:

    setlocale (LC_ALL, 'sl_SI.UTF-8');
    uksort($gradiva[$ind], 'cmp');

    function cmp($a, $b) {
    return strnatcasecmp($a, $b);
    }

  23. F57 je napisal:

    Se da dobit kakšen napotek, kako v "Filter rezultatov - produkti, ki se začnejo z ...." vstavit še šumnike? Vsa zadeva je že v utf-8 in sicer ni težav, razen za sortiranje izdelkov, ki se začnejo z določeno črko. Tu namreč manjkajo č,š in ž.

  24. Antony je napisal:

    Odvisno katero platformo imaš. Predvidevam, da moraš popraviti prevode oz datoteko, ki generira filter oz iskalnik.

  25. F57 je napisal:

    Zadeva je Zen Cart. V alphabetic filter pa bi še se vstavilo še šumnike, tako da ta filter lahko najde še izdelke začenši z č,š,ž.

Dodaj komentar