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

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: Reakce na: Jakub Vrána

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