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').

Jakub Vrána, Seznámení s oblastí, 12.8.2005, on-line

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

ikona Radek Hulán:

setlocale(LC_ALL, 'cs_CZ.UTF-8');
12.8.2005 10:52:50

ikona 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.
12.8.2005 11:55:44

ikona Radek Hulán:

Zajímavé, já "cs_CZ.UTF-8" používám třeba na hulan.cz a názvy měsíců jsou hezky česky: http://hulan.cz/blog/archives/welldone
13.8.2005 11:55:25

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

ikona Radek Hulán:

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

ikona 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".
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

ikona Jakub Vrána:

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#msftiso
http://www.microsoft.com/globaldev/reference/iso/28592.mspx
http://www.microsoft.com/globaldev/reference/default.mspx
10.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

ikona 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".
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

ikona Jakub Vrána:

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

kriplozoik:

..
<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

ikona 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íš.
24.9.2010 06:28:55
avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.