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

reference spletnih strani
3rd March

UTF-8 tabele, vendar latin1 podatki ter povezava

Vsem tabelam (in bazi) nastavimo UTF-8 charset (kodno tabelo):

MySQL:
  1. CHARACTER SET utf8 COLLATE utf8_slovenian_ci

V PHP-ju nastavimo UTF-8 header:

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

... ali (in tudi) v HTML kodi dodamo nastavitev, ki pove brskalniku, da bodo naši podatki v UTF-8 obliki (oz. zapisu):

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

... in tako naredimo naš projekt UTF-8 združljiv oz. vsaj tako mislimo. Tudi meni (nam) se je to zgodilo pri cup.si. Kaj je tukaj narobe se (mogoče) sprašujete? Problem je v tem, da je privzeta vrednost za povezavo med PHP-jam in MySQL-om latin1 kodna tabela, torej podatke, ki jih pošiljamo z PHP-jem na (v) MySQL bazo so v UTF-8 obliki vendar je povezava preko katere prenesemo to vsebino v latin1 obliki, kar pomeni težave. Seveda je tudi (ponavadi) tako v obratni smeri. Rezultat, ki nam ga posreduje MySQL je privzeto v latin1 obliki.

Najprej si poglejmo kakšne vrednosti so nastavljene pri naši povezavi do baze in sicer z ukazom:

MySQL:
  1. SHOW VARIABLES LIKE 'c%';

Rezultat je nekaj podobnega temu (prikazane so vrednost, ki so nam zanimive):

[character_set_client] => latin1
[character_set_connection]=> latin1
[character_set_results] => latin1
[collation_connection] => latin1_swedish_ci

Najlažja rešitev je, da že v konstruktor database objekta izvedete poizvedbo (query), ki nastavi povezavo in charset, ki bo uporabljen pri MySQL rezultatu na UTF-8 oz. na tisto, kar mi želimo. Primer za UTF-8 (slovenian):

PHP:
  1. mysql_query("SET NAMES 'utf8' COLLATE 'utf8_slovenian_ci'", $link_id);

Po tem nam PHP prikaže željene rezultate:

[character_set_client] => utf8
[character_set_connection]=> utf8
[character_set_results] => utf8
[collation_connection] => utf8_slovenian_ci

Kaj pa, če že imamo podatke (v latin1 kodni tabeli) v bazi in jih moramo sedaj pretvoriti v UTF-8? Rešitev je, da vsa polja, ki vsebujejo tekst (char - varchar - text - enum) spremenimo v binarno tipe, spremenimo kodno tabelo in nato spremenjena polja damo v prvotno obliko (tipe). Sicer sem že kar nekaj časa nazaj napisal svojo skripto, ampak sem danes našel še lepše napisano kodo (wodpress plugin) in zato uporabil najdeno rešitev (kodo) problema pri cup.si z malenkostnim popravkov in sicer sem dodal še collation (utf8_slovenian_ci) attribut in namesto takojšne izvajanje poizvedb (query) raje izpisal le-te na ekran. Kodo sem dodal pod priponko.

Zadeva deluje, je pa pri cup.si vseeno bilo moč najti še kakšne napake pri šumnikov in sicer sledeči znaki 'Ž', 'ž', 'Å¡', 'Å', 'ÄŒ', 'Ä', ki bi morali biti 'Ž', 'ž', 'š', 'Š', 'Č', 'č'. Ker so bili ti primeri dokaj redki, a se mi vseh tabel ni dalo popravljati na roko sem dodal še sledeči del kode, ki nadomesti vse najdene znake:

PHP:
  1. function convert($data, $table) {
  2.   $do_update = false;
  3.  
  4.   foreach($data as $k => $value) {
  5.     if (!is_array($value)) {
  6.       $count    = 0;
  7.       $data[$k] = str_replace(array('Ž', 'ž', 'Å¡', 'Å', 'ÄŒ', 'Ä'), array('Ž', 'ž', 'š', 'Š', 'Č', 'č'), $data[$k], $count);
  8.  
  9.       if ($count> 0) {
  10.           $do_update = true;
  11.       }
  12.     }
  13.   }
  14.  
  15.   if ($do_update === true) {
  16.     $query = createGenericUpdateSQL($data, $table, key($data), $data[key($data)]);
  17.     dump($query);
  18.   }
  19. }

... s tem sem prišel do željenega rezultata ter pripravljeno skripto, ki jo lahko vzamemo tudi za druge primere (probleme), če bodo (ko bodo) ti nastopili.

Več informacij:

Datoteka (shranite v UTF-8 formatu !!!):

Projekt: cup.si
Delodajalec: Atelje za tisk Ines malgaj s.p. (eliteplaying)

Smo pa podoben problem imeli tudi pri KMAG-u, kjer so bili latin2 podatki shranjeni v UTF-8 tabelah (bazi) in smo jih morali pretvoriti v UTF-8 podatke (ter seveda shraniti v UTF-8 bazo). Najbrš bo v prihodnosti tega še več:P. Tukaj je potrebno omeniti, da je rešitev več, recimo uporaba hex2bin, kot je to opisano tukaj, kakšen način boste izbrali pa je odvisno od vas.

Deli s skupnostjo:

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

Podobni članki:

  1. PHP – delo z UTF-8 stringi oz. podatki – težave s šumniki (č,š,ž)
  2. MySQL kreiranje tabele s SELECT stavkom
  3. Preprosta skripta – kreiranje Excel datoteke iz PHP tabele/array
  4. Šumniki – UTF-8 – Težave – PHP & MySQL
  5. Zen Cart – UTF-8 podpora – pretvorba
  6. HTML Mime Mail PHP – nastavljanje kodne tabele (charset – windows-1250 – UTF-8) – Outlook Express
  7. Hitri vnos/uvoz podatkov v MySQL preko LOAD DATA INFILE
  8. Stalni UTF-8 problemi – utf8 mysql php – čšž šumniki težave – iskanje znaki – mysql like
  9. Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8
  10. PHP – pošiljanje emaila – epošte – sending email – HTML Mime Mail

11x komentirano na “UTF-8 tabele, vendar latin1 podatki ter povezava”

  1. Jure Cuhalev je napisal:

    Zakaj ne uporabljas ORM-ja?

  2. Roky je napisal:

    Misliš za delo z bazo ali konvertiranja samega? Kater ORM imaš v mislih?

  3. .: TRSplet - internetne storitve .: » Blog Archive » Šumniki - UTF-8 - Težave - PHP & MySQL je napisal:

    [...] 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: PLAIN TEXT [...]

  4. .: TRSplet - internetne storitve .: » Blog Archive » Uporabni HTML meta tagi - PHP header je napisal:

    [...] UTF-8 tabele, vendar latin1 podatki ter povezava [...]

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

    [...] UTF-8 tabele, vendar latin1 podatki ter povezava [...]

  6. GrimFandango je napisal:

    Pozdravljeni!

    Lahko še malo bolj podrobno?
    Namreč na strani kjer imamm problem se v IE ne prikažer pravilno v FF pa.
    Stran je http://www.triglif.

    Pa da ne bom na roko vseh collationov delal me zaqnima predvsem ta korak:

    "Zadeva deluje, je pa pri cup.si vseeno bilo moč najti še kakšne napake pri šumnikov in sicer sledeči znaki 'Ž', 'ž', 'Å¡', 'Å', 'ÄŒ', 'Ä', ki bi morali biti 'Ž', 'ž', 'š', 'Š', 'Č', 'č'. Ker so bili ti primeri dokaj redki, a se mi vseh tabel ni dalo popravljati na roko sem dodal še sledeči del kode, ki nadomesti vse najdene znake:"

    Kamo točno se ta skripta vstavi v phpmyadminu?

    Hvala vnaprej za kakršnokoli pomoč!

  7. GrimFandango je napisal:

    Še tole, ko refrešam v IE, pa vse dela kakor bi moralo. torej se šum niki normalno prkažejo.

    Lep pozdrav!

  8. Roky je napisal:

    Če hočem it na to spletno stran mi javi .. Prosimo, obiščite spletno stran kasneje.
    Ponudnik spletnega gostovanja je podjetje Hitrost.com d.o.o.. Sporoči ko bo "ready", da pogledam.

  9. GrimFandango je napisal:

    sori stran je http://www.triglif.si

    morala bi delat...

    hvala

  10. GrimFandango je napisal:

    mogoče še tole za pomoč :

    Variable_name Value
    character_set_client utf8
    character_set_connection utf8
    character_set_database utf8
    character_set_filesystem binary
    character_set_results utf8
    character_set_server latin1
    character_set_system utf8
    character_sets_dir /usr/share/mysql/charsets/
    collation_connection utf8_general_ci
    collation_database utf8_slovenian_ci
    collation_server latin1_swedish_ci
    completion_type 0
    concurrent_insert 1
    connect_timeout 15

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

    [...] T&R Splet smo enkrat že obdelali probleme, ko imamo UTF-8 bazo, vendar v tej bazi shranjene CP1250 podatke. Vzrok tega je, da imamo nastavljeno CP1250 povezavo na [...]

Dodaj komentar