Převod na velká písmena
Pokud chcete v PHP převést text na velká písmena, můžete k tomu použít funkci strtoupper. Problém samozřejmě nastává u znaků s diakritikou – jejich převod se řídí nastaveným jazykovým prostředím, které můžete ovlivnit funkcí setlocale, ale napsat kód tak, aby fungoval pod Windows i Linuxem např. s kódovou stránkou UTF-8 já osobně neumím. Použít proto můžete např. funkci mb_strtoupper, které kódování jednoduše předáte.
<?php
// použije se výchozí kódování operačního systému pro češtinu
setlocale(LC_ALL, 'cs_CZ');
echo strtoupper("zvětšit");
?>
Pokud chcete písmo zvětšit jen proto, abyste ho mohli následně vypsat do HTML stránky, můžete zvětšení písma v prohlížeči elegantně zajistit CSS vlastností text-transform. Pokud řetězec ukládáte do databáze, můžete také použít databázovou funkci, v MySQL 4.1 např. UPPER('zvětšit')
.
Diskuse
JohnyB:
UTF na oknech funguje dost podezřele, někdo kdysi sice vyhrabal správné locale dle MSDN, ale funkce se stejně chovaly divně a nakonec byly výsledky polámané. Pokud není třeba UTF, tak v novějších verzích PHP stačí při nastavování locales zadat několik názvů locale najednou jako vícenásobný parametr a PHP si vezme prvni, ktery se chyti.
12.8.2005 06:15:21
Zdeněk Merta:
Locale na Windows radši vůbec nepoužívat. Problémy jsem měl nejen u UTF-8, ale i u ostatních kódování. A to snad ve všech oblastech I18N.
No ono je vlastně vhodnější PHP na Windows nepoužívat vůbec :-D
15.8.2005 23:15:39
tonco:
<?php
$string = "ľščťžýáíéňäúô";
echo mb_strtoupper("$string", "utf-8");
?>
8.11.2007 01:18:35
setlocale(LC_ALL, 'cs_CZ.UTF-8');
12.8.2005 10:52:50
Tak tohle mi zrovna nefunguje na Linuxu ani na Windows XP. `locale -a | grep cs` říká cs_CZ.utf8, na Windows nic podobného neznám.
12.8.2005 11:55:44
JohnyB:
Názvy locale těžce závisí na systému, u *nixů i na distribuci, neboť co distro, to jinak symlinkované locales. Proto prosím vynech tento "zjednodušující" tón.
13.8.2005 19:07:28
Samozřejmě, admin musí vědět co má a jak správně zkompilovat, špatný webhosting to umět nebude..
18.8.2005 14:51:08
Jiří Sekera:
Věta "pokud chcete písmo zvětšit jen proto, abyste ho mohli následně vypsat do HTML stránky, můžete zvětšení písma v prohlížeči elegantně zajistit CSS vlastností text-transform" je zavádějící.
Výběr nespočívá mezi zvětšením ve zdrojovém kódu již na serveru a zvětšením u klienta pomocí CSS. Je třeba text zapsat správně (tj. např. USA nebo Telecom) a teprve poté určit jeho zvýraznění pomocí sémantického značkování a CSS.
12.8.2005 11:15:23
Jistě, věta tak byla myšlena - tedy "Pokud je důvodem zvětšování zvýraznění (což je obvyklé), je vhodné použít vlastnost text-transform".
12.8.2005 11:17:58
halogan:
Ke vsi spokojenosti pouzivam mb_strtoupper/lower() a bez problemu s UTF
12.8.2005 14:04:23
Havran:
Toto funguje pre Windows XP (pre triedenie a predpokladam ze bude aj pre strtoupper):
<?php
setlocale(LC_ALL, 'sk_SK', 'slovak', 'slovak_slovak', 'svk_svk.windows1250');
uasort($key_array, 'strcoll');
?>
12.8.2005 16:22:23
S windows-1250 není problém. Problém je s UTF-8.
12.8.2005 16:31:11
Havran:
Práve sa s tým (opäť) zaoberám pre MOODLE. Pokiaľ mám na windows nastavené locales v MOODLE na slovak_SLOVAK, pričom jazykový balíček MOODLE (slovenský) je vytvorený v LATIN2, zobrazené názvy dní v týždni sú zlé (konkrétne štvrtok a nedeľa - š a ľ). Ale prišiel som na to že keď dám za slovak_SLOVAK numerické vyjadrenie kódovania LATIN2 zobrazuje sa deň v správnom kódovaní. Konkrétne pokusný kód pre ISO 8859-2:
<?php
setlocale(LC_ALL,'slovak_SLOVAK.28592');
$today = time();
echo strftime('%A');
?>
a pre Windows 1250
<?php
setlocale(LC_ALL,'slovak_SLOVAK.1250');
$today = time();
echo strftime('%A');
?>
funguje. Teraz už len zostáva zistiť ako si predstavujú v MS že treba označiť UTF8 a snáď sa nám podarí konečne rozbehať aj to.
Informácie som ponachádzal rôzne na nete a hlavne som skúšal, metóda pokus omyl síce nie je rýchla ale občas dá výsledok. Aby som nezabudol - skúšal som to na Windows XP SP2 - netuším ako by sa to správalo inde.
http://www.i18nguy.com/unicode/codepages.html#msftisohttp://www.microsoft.com/globaldev/reference/iso/28592.mspxhttp://www.microsoft.com/globaldev/reference/default.mspx10.2.2006 19:33:48
Havran:
PS: zabudol som podotknúť že som si na PC schválne nastavil deň na nedeľu (a character encoding som si menil v prehliadači - FF)
10.2.2006 19:35:34
Michal Aichinger:
Vím že to jsem uplně nepatří, ale mořil jsem se s porovnáváním textových řetězců v poli. Projekt píšeme v cp1250 a vytvořil jsem tento kód. To opakování by šlo hodit do funkce, ale je to takhle názornější.
<?php
/**
* funkce pro volani z usort(), uasort() a podobne.
* provadi porovnavani retezcu v cp1250 kodovani
*/
function compareArrayItems($a, $b) {
for($i = 0; $i < strlen($a); $i++ ) {
$letterA = $a[$i];
$letterB = $b[$i];
if (preg_match('/[^0-9a-zA-Z]/',$letterA)) { //pokud znak neni asci prevedu na asci
$letterA = strtr( $letterA, "áäèïéìëíòóöøš úùüýžÁÄÈÏÉÌËÍÒÓÖØŠ ÚÙÜÝŽ",
"aacdeeeinoorstuuuyzAACDEEEINOORSTUUUYZ");
$ordA = ord($letterA) + 0.5;
} else {
$ordA = ord($letterA);
}
if (preg_match('/[^0-9a-zA-Z]/',$letterB)) { //pokud znak neni asci prevedu na asci
$letterB = strtr( $letterB, "áäèïéìëíòóöøš úùüýžÁÄÈÏÉÌËÍÒÓÖØŠ ÚÙÜÝŽ",
"aacdeeeinoorstuuuyzAACDEEEINOORSTUUUYZ");
$ordB = ord($letterB) + 0.5;
} else {
$ordB = ord($letterB);
}
//porovnavani ordinalnich hodnot, dle nich radim,
//akcentovane znaky maji ord hodnotu o 0.5 vetsi a proto se radi za neakcentovane
if ($ordA < $ordB) {
return -1;
}
if ($ordB < $ordA) {
return 1;
}
}
return 0;
}
?> 22.6.2006 14:34:50
Dlouhá písmena se v češtině řadí na stejné místo jako krátká. Např. "á" by tedy mělo dostat stejný kód jako "a".
23.6.2006 11:46:15
Uncode:
<?php
$slovo="BĚŽET";
setlocale(LC_ALL,'utf-8');
$slovo=mb_strtolower($slovo);
echo $slovo;
?>
Mi vypise nesmysl typu: b??et
21.4.2007 21:16:05
setlocale neslouží k nastavení kódování, ale k nastavení jazyka. Můžeš zkusit "cs_CZ.UTF-8".
22.4.2007 13:34:22
Uncode:
to jsem samozrejme zkousel, ale je na to stejna odezva
28.4.2007 00:48:01
..
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
..
<?php
$slovo='BĚŽET';
echo mb_strtolower($slovo,'utf-8');
?>
10.6.2008 16:15:38
Otto:
Nefunguje to! Ať zadáš co zadáš!
Nechápu proč sem perete rady, když nic nefunguje :-) Když pak člověk cokoliv hledá tak mu lezou jenom tyhle nefunknční nesmysle od rádoby profíků.
Když už teda chci někomu pordadit, tak laskavě s funkčním řešením!
23.9.2010 13:02:58
V článku je jasně uvedené, že univerzální řešení pomocí setlocale() a strtoupper() neznám (protože nejspíš neexistuje). Místo toho je doporučeno použití funkce mb_strtoupper(). Nefunguje ti snad tato funkce? Pak je chyba nejspíš na tvé straně (uvedení špatného kódování nebo něco podobného).
U mých článků musíš pochopit jejich myšlenku, ne jen bezhlavě zkopírovat první ukázku kódu, na kterou narazíš.
24.9.2010 06:28:55