UTF8 ékezet 1 karakter, vagy 2 karakter hosszú?
Sziasztok!
Adott egy oldal és a mögötte lévő MySQL adatbázis, ahol minden UTF-8 kódolású.
Az egyik feladata az oldalnak, hogy válogassa le pl. az "a" kezdőbetűs szavakat az adatbázisból.
Eddig minden rendben is van. Megkapom a következő listát kiíratva az oldalon (ékezetek, minden tökéletesen helyes):
Alma
asztal
Ágy
állat
autó
ablak
árok
Ás
..
....
stb.
A feladatom és a problémám egyben a következő: le kell(ene) minden szó első betűjét vágnom, azonban az UTF-8 kódolás miatt ez az ékezetes kezdőbetűknél nem működik.. :(
Ezzel a paranccsal akarom megkapni a kisbetűsre konvertált első karaktert: $first_cap=strtolower($myrow[0]{0});
de próbáltam így is: $first_cap=substr($myrow[0],0, 1);
Ezek a parancsok sajnos csak a nem ékezetes kezdőbetűjű szavaknál működtek.
ha pl. az Ágy szóhoz érkezem, a válasz IE alatt egy kis kocka, illetve Firefox alatt egy ? lesz.
Megpróbáltam az utf8-decode és az iconv függvényeket is, de nem lett jobb a helyzet.
Rájöttem azonban, hogy ha az ékezettel kezdődő szavak első két karakterét vágom ki, pl.:
$first_cap=substr($myrow[0],0, 2);
akkor fogom megkapni a $first_cap változóba az "á" karaktert.
Ez remek, már csak el kellene tudnom dönteni, hogy mikor vágjak le a szó elejéről egy és mikor kettő karaktert.
Ötlet, tipp...?
■ Adott egy oldal és a mögötte lévő MySQL adatbázis, ahol minden UTF-8 kódolású.
Az egyik feladata az oldalnak, hogy válogassa le pl. az "a" kezdőbetűs szavakat az adatbázisból.
Eddig minden rendben is van. Megkapom a következő listát kiíratva az oldalon (ékezetek, minden tökéletesen helyes):
Alma
asztal
Ágy
állat
autó
ablak
árok
Ás
..
....
stb.
A feladatom és a problémám egyben a következő: le kell(ene) minden szó első betűjét vágnom, azonban az UTF-8 kódolás miatt ez az ékezetes kezdőbetűknél nem működik.. :(
Ezzel a paranccsal akarom megkapni a kisbetűsre konvertált első karaktert: $first_cap=strtolower($myrow[0]{0});
de próbáltam így is: $first_cap=substr($myrow[0],0, 1);
Ezek a parancsok sajnos csak a nem ékezetes kezdőbetűjű szavaknál működtek.
ha pl. az Ágy szóhoz érkezem, a válasz IE alatt egy kis kocka, illetve Firefox alatt egy ? lesz.
Megpróbáltam az utf8-decode és az iconv függvényeket is, de nem lett jobb a helyzet.
Rájöttem azonban, hogy ha az ékezettel kezdődő szavak első két karakterét vágom ki, pl.:
$first_cap=substr($myrow[0],0, 2);
akkor fogom megkapni a $first_cap változóba az "á" karaktert.
Ez remek, már csak el kellene tudnom dönteni, hogy mikor vágjak le a szó elejéről egy és mikor kettő karaktert.
Ötlet, tipp...?
mb függvények
http://hu.php.net/manual/hu/function.mb-substr.php
saját fv
http://vbence.web.elte.hu/utf8_latin2_iso8859_2_kovertalas.html
más megoldás
Kiegészítés
igaz
Megoldva!
Lehet, hogy nem fogalmaztam tisztán, maga a PHP fájl és az oldal is UTF-8-as kódolású. :)
whatwho megoldása tökéletes volt!
A multibyte függvények ezen belül az mb_substr tökéletesen működik, de csak akkor, ha előtte meghívom a mb_internal_encoding("UTF-8"); függvényt is.
Nagyon szépen köszönöm!
Bence megoldására már korábban is ráakadtam a google segítségével, most is megpróbáltam becsülettel, de sajnos nekem nem sikerült vele jó karaktereket csinálnom valószínű azért, mert nekem az oldal is UTF-8-as kódolású, de a függvényt elmentettem magamnak, máskor még jól jöhet! :)
Az UTF decode függvényt is próbáltam, amit GEX írt, de nekem az sem volt jó megoldás.
Még egyszer nagyon köszönöm a gyors válaszokat és a megoldást! :)
ballR
Minden utf-8?
Ha a MySQL DB:
De ha ez sem segít, akkor érdekel, hogy mi a jó megoldás :)
Talán
Azért is szerencsésebb nekem az mb_substr függvényeket használnom, mert nem csak magyar szavakat fog az oldal majd listázni, és ez olyan esetekben is segít, mind a szláv nyelvekben lévő "kalapos" betűk. (Pl. a Skoda felirat S betűjénak is a tetején kis "kalap" van.)
Ezért nekem nem célom hogy az SQL leválogatásnál binary szűrjek, amit egyébként kipróbáltam, működik, de a karakterekre bontás még így sem lett megoldva.
Viszont az mb.substr függvény tökéletes, mert ha én az első karaktert kérem a szóból, vagy az ötödiket, akkor is pontosan az (és csakaz!) a karakter kerül levágásra, ami nekem kell.
És végre így újra meg tudom számolni az egys szavak betűinek számát az mb_strlen -nel, mert a sima strlen a kódolás miatt mindig többet mondott.
Jó jó ez az UTF, de egy csomó problémát is generál a megszokott eljárásokhoz képest... :)
mi a megszokott?
A kérdés az, hogy mi a megszokott. Ez egyébként nem az utf-8, hanem a php hibája (régi verziókban szegényes támogatás; talán a php 6).