ugrás a tartalomhoz

A kifejezés első szava nagy kezdőbetűvel

jeti · 2010. Júl. 25. (V), 16.38
Sziasztok!

Sajnos a fent említett problémát eddig nem tudtam megoldani.
A lényeg, hogy több szóból is állhat a kifejezés, de én csak az első szó első betűjét szeretném nagyra állítani.

Én UTF8-as kódolást használok a meta tagoknál, a fájlok kódolásánál.
Az adat adatbázisból származik, az adatbázis, a tábla, a mező kódolása: utf8_general_ci.
Több dologgal is próbálkoztam, de nem jutottam előrébb.
0.) ucwords(mb_strtolower($row->melsojv, 'ISO-8859-2')); -> kisbetűs marad
1.) ucwords( strtolower($string)); -> kisbetűs marad
2.)
$adat=str_ireplace("á","Á",$adat);
$adat=str_ireplace("é","É",$adat);
$adat=str_ireplace("í","Í",$adat);
$adat=str_ireplace("ó","Ó",$adat);
$adat=str_ireplace("ö","Ö",$adat);
$adat=str_ireplace("ő","Ő",$adat);
$adat=str_ireplace("ú","Ú",$adat);
$adat=str_ireplace("ü","Ü",$adat);
$adat=str_ireplace("ű","Ű",$adat);
-> ez jó, csak minden ékezetes betű nagy betűs lesz
3.)
switch($adat[0])
{
case "á": $adat[0]="Á"; break;
case "é": $adat[0]="É"; break;
case "í": $adat[0]="Í"; break;
case "ó": $adat[0]="Ó"; break;
case "ö": $adat[0]="Ö"; break;
case "ő": $adat[0]="Ő"; break;
case "ú": $adat[0]="Ú"; break;
case "ü": $adat[0]="Ü"; break;
case "ű": $adat[0]="Ű"; break;
}
-> kisbetű marad
4.)
$cst=array("á"=>"Á","é"=>"É","í"=>"Í","ó"=>"Ó","ö"=>"Ö","ő"=>"Ő","ú"=>"Ú","ü"=>"Ü","ű"=>"Ű");
foreach ($cst as $keres => $csere)
{
if ($adat[0]==$keres) $adat=$csere.substr($adat,1);
print("*".$keres."-".$csere."+".$adat[0]."*");
}
-> kis betűs marad
A kimenet a következő: "*á-Á+�**é-É+�**í-Í+�**ó-Ó+�**ö-Ö+�**ő-Ő+�**ú-Ú+�**ü-Ü+�**ű-Ű+�*", ez elvileg az é betű akar lenni ami a böngészőben simán megjelenik.

Van valakinek valami ötlete, hogy mit rontok el?
 
1

ucfirst() sem megy

jeti · 2010. Júl. 25. (V), 16.43
5.) Azt kifelejtettem, hogy a $adat=ucfirst($adat); sem megy.
2

adatbázis kilőve

jeti · 2010. Júl. 25. (V), 16.50
Ha megadok egy tetszőleges é betűvel kezdő szót, akkor is �-et kapok, tehát nem az adatbázisban van valami rosszul beállítva.
3

mb_convert_case

Poetro · 2010. Júl. 25. (V), 16.51
mb_convert_case($szoveg, MB_CASE_TITLE, 'utf-8');
Ha csak az első szó kell, akkor vágd le róla vagy az első szót, vagy az első karaktert, és azt konvertáld nagyra. Annyit elárulok, hogy ehhez is majd az mbstring függvényeket kell használni, például mb_strpos az első szóköz megtalálásához, vagy mb_substr az első karakter, vagy szó levágásához, majd vagy mb_convert_case vagy mb_strtoupper a konvertáláshoz.
4

Hibás megoldások

Poetro · 2010. Júl. 25. (V), 16.56
A 3-as és 4-es egyértelműen hibás megoldások, mivel az $adat[0] a 1. bájtot veszi, nem az első karaktert, ugyanis az UTF-8 kódolású karakterek több bájtot is foglalhatnak, akár 3-at is, és az $adat[0] ebből csak az első bájt, ami miatt a karakter teljesen el fog csúszni, és persze nem lesz találat a switch-ben sem, mivel ott az első bájtot hasonlítod össze egy több bájtos szöveggel.
5

Köszönöm

jeti · 2010. Júl. 25. (V), 17.30
Köszönöm a segítséget, sikerült megoldanom.
$kb=mb_strtoupper(mb_substr($adat,0,1,'utf-8'),'utf-8');
$adat=$kb.mb_substr($adat,1,mb_strlen($adat)-1,'utf-8');


Egy elméleti kérdésem is lenne, ehhez miért kellenek új függvények (mbstring), miért nem lehet a meglévő függvényeket egy-egy újabb paraméterrel (a kódolással) kibővíteni és hivatkozni rá, hogy melyik verziótól használható? Vagy egy következő php verzióban az utf-8 lesz az alap karakterkészlet és addig fölösleges ideglenesen új paramétert bevezetni?