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

Jakub Vrána, Seznámení s oblastí, 12.8.2005, diskuse: 23 (nové: 0)

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");
?>

ikona Radek Hulán:

setlocale(LC_ALL, 'cs_CZ.UTF-8');

ikona Jakub Vrána OpenID:

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.

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

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.

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

ikona Jakub Vrána OpenID:

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');
?>

ikona Jakub Vrána OpenID:

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

ikona Jakub Vrána OpenID:

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

ikona Jakub Vrána OpenID:

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!

ikona Jakub Vrána OpenID:

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

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2017 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.