Převod na velká písmena
Školení, která pořádám
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.
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
tonco:
<?php
$string = "ľščťžýáíéňäúô";
echo mb_strtoupper("$string", "utf-8");
?>
Jakub Vrána :
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.
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.
Radek Hulán:
Samozřejmě, admin musí vědět co má a jak správně zkompilovat, špatný webhosting to umět nebude..
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.
Jakub Vrána :
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".
halogan:
Ke vsi spokojenosti pouzivam mb_strtoupper/lower() a bez problemu s UTF
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');
?>
Jakub Vrána :
S windows-1250 není problém. Problém je s UTF-8.
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.mspx
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)
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;
}
?>
Jakub Vrána :
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".
Uncode:
<?php
$slovo="BĚŽET";
setlocale(LC_ALL,'utf-8');
$slovo=mb_strtolower($slovo);
echo $slovo;
?>
Mi vypise nesmysl typu: b??et
Jakub Vrána :
setlocale neslouží k nastavení kódování, ale k nastavení jazyka. Můžeš zkusit "cs_CZ.UTF-8".
Uncode:
to jsem samozrejme zkousel, ale je na to stejna odezva
kriplozoik:
..
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
..
<?php
$slovo='BĚŽET';
echo mb_strtolower($slovo,'utf-8');
?>
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!
Jakub Vrána :
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íš.
Diskuse je zrušena z důvodu spamu.