Š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 Urejevalnik (editor - IDE) mora imeti nastavljeno UTF-8 branje / shranjevanje datotek (priporočam Zend Studio ali Eclipse)
- #2 Datoteke morajo biti zapisane brez BOM znaka (ponavadi notepad, notepad++ itd..)
- #3 Na začetku skripte nastavimo UTF-8 s PHP-jem
- #4 V HTML head tag-u dodamo (nastavimo) content-type
- #5 PHP povezava do MySQL (ali druge) baze mora imeti nastavljen UTF-8 encoding
- #6 Vsi podatki v bazi morajo biti shranjeni kot UTF-8 podatki (preko UTF-8 povezave)
#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
#4 HTML meta content-type
-
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
#5 PHP encoding MySQL povezave
-
"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:
-
CREATE TABLE `utf8tabela` (
-
`utf8poljevarchar` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_slovenian_ci,
-
`utf8poljetext` TEXT CHARACTER SET utf8 COLLATE utf8_slovenian_ci
-
) CHARACTER SET utf8 COLLATE utf8_slovenian_ci;
Uporabno:
#1 PHP Sortiranje UTF-8 podatkov v tabeli (array):
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:
- Vprašanja & Odgovori o UTF-8, UTF-16, UTF-32, BOM
- php-si.com - tema na forumu o UTF-8
- Primer spletne strani, kjer so podatki za encoding pravi (php header, html content type) (Firefox, Page info)
- Slo-tech - foruma tema o UTF-8 in dolzina polja v MySQL
- PHP - funkcije za delo z UTF-8 stringi
Blogi:
- PHP setLocale in seznam kod za države
- Wordpress 2.x - UTF-8
- UTF-8 PHP napotki
- UTF-8 in PHP6
- Miha Lavtar - prispevek o UTF-8
Podobni članki:
- Stalni UTF-8 problemi – utf8 mysql php – čšž šumniki težave – iskanje znaki – mysql like
- PHP – delo z UTF-8 stringi oz. podatki – težave s šumniki (č,š,ž)
- Windows – lokalni MySQL uvoz podatkovne baze – velika podatkovna baza – težave pri uvozu velikih MySQL baz
- UTF-8 tabele, vendar latin1 podatki ter povezava
- Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8
- Zen Cart – UTF-8 podpora – pretvorba
- MySQL kreiranje tabele s SELECT stavkom
- Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)
- Zend Search Lucene – UTF8 podpora – iconv težave
- MySQL iskanje LIKE vs FULL-TEXT



March 21st, 2008 ob 2:03 pm
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.
March 21st, 2008 ob 4:57 pm
Aha, možno, vem da so imeli nekateri težave s tem pa sem hotel izpostavit, da je to eden izmed možnih problemov.
March 22nd, 2008 ob 3:34 pm
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č ...
March 22nd, 2008 ob 4:45 pm
Jest sem zaenkrat na ZendStudio, mi je še najbolj všeč, le debug se moram še spravit uporabljat:P
March 24th, 2008 ob 2:13 pm
6. točka ni ravno resnična. MySQL zna pretvarjati med charseti, tako da je čisto vseeno v katerem charsetu je sama baza.
March 24th, 2008 ob 4:07 pm
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).
March 24th, 2008 ob 10:59 pm
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.
March 25th, 2008 ob 8:04 am
Pa si ziher, da ORDER BY 'cčsšzžČŠŽĐĆ' dela pravilno ko so multi-byte characterji?
March 25th, 2008 ob 9:00 am
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.
March 25th, 2008 ob 11:40 am
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.
March 25th, 2008 ob 10:14 pm
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.
March 25th, 2008 ob 10:17 pm
Če je tako, ti verjamem. Zanimiva rešitev in en info več:P
April 16th, 2008 ob 9:21 pm
[...] UTF-8 - šumniki - čšž [...]
May 15th, 2008 ob 8:39 am
[...] Šumniki - UTF-8 - Težave - PHP & MySQL [...]
May 23rd, 2008 ob 5:06 pm
[...] V database objektu moramo dodati query, ki nastavi UTF-8 povezavo med MySQL in PHP [...]
June 4th, 2008 ob 12:04 am
[...] Šumniki - UTF-8 - Težave - PHP & MySQL [...]
June 8th, 2008 ob 12:13 am
[...] Drugače boste dobivali zelo čudne napake / rezultate. Več o teh težavah povezanih z BOM znakom. [...]
May 12th, 2009 ob 2:40 pm
Carsko, 10 let zakopan v php pa šele zdajle slišim za strcoll
... ah ja, tko je, k mysql deluje!
Hvala! LP
May 13th, 2009 ob 8:56 am
Vsak dan nekaj novega:) Me veseli ...
August 21st, 2009 ob 1:07 pm
[...] 3.) Zaženite http://vasa_domena.si/utf8convert.php 4.) Sledite navodilom kako vašo spletno stran pre-konvertirati v UTF-8 način [...]
August 21st, 2009 ob 4:05 pm
[...] 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, [...]
September 9th, 2009 ob 8:19 am
Ž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);
}
August 26th, 2010 ob 10:28 am
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 ž.
August 28th, 2010 ob 9:20 am
Odvisno katero platformo imaš. Predvidevam, da moraš popraviti prevode oz datoteko, ki generira filter oz iskalnik.
August 30th, 2010 ob 9:22 am
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 č,š,ž.