Úvod >PHP >Základy PHP >Jak odstranit diakritiku z proměnné?

Jak odstranit diakritiku z proměnné?

Odstranění diakritiky, nebo-li českých znaků, se velmi hodí například při ukládání souborů kdy v názvu nechcete znaky jako "ž", či "š". Na to by bylo vhodné písmeno "ž" nahradit za "z" atd.. jak na to?

Poznámka: Která varianta funguje, záleží na kódování textu. 1. varianta funguje jen v jednobajtovém kódování (windows-1250 nebo ISO-8859-2), ve kterém se weby dříve běžně psaly. Dnešní weby používají kódování UTF-8 – pro ně je 2. nebo 3. varianta.

1. varianta
  
$nazev_souboru=strtr($nazev_souboru,
"áäčďéěíĺľňóôőöŕšťúůűüýřžÁÄČĎÉĚÍĹĽŇÓÔŐÖŔŠŤÚŮŰÜÝŘŽ",
"aacdeeillnoooorstuuuuyrzAACDEEILLNOOOORSTUUUUYRZ");

Jak to funguje: strtr se dvěma řetězci nahrazuje jednotlivé bajty – první bajt prvního řetězce za první bajt druhého, druhý za druhý a tak dále. V kódování windows-1250 má každé písmeno jeden bajt, takže se „á“ nahradí za „a“, „č“ za „c“ atd. V UTF-8 ale zabírá každé písmeno s diakritikou dva bajty. Řetězce si pak přestanou odpovídat a text se poškodí – ze „Žluťoučký kůň“ vznikne „RUluRNoutekUU kRORu“.



2. varianta
  
$utf8table = array
("\xc3\xa1"=>"a","\xc3\xa4"=>"a","\xc4\x8d"=>"c","\xc4\x8f"=>"d","\xc3\xa9"=>"e","\xc4\x9b"=>"e","\xc3\xad"=>"i","\xc4\xbe"=>"l","\xc4\xba"=>"l","\xc5\x88"=>"n","\xc3\xb3"=>"o","\xc3\xb6"=>"o","\xc5\x91"=>"o","\xc3\xb4"=>"o","\xc5\x99"=>"r","\xc5\x95"=>"r","\xc5\xa1"=>"s","\xc5\xa5"=>"t","\xc3\xba"=>"u","\xc5\xaf"=>"u","\xc3\xbc"=>"u","\xc5\xb1"=>"u","\xc3\xbd"=>"y","\xc5\xbe"=>"z","\xc3\x81"=>"A","\xc3\x84"=>"A","\xc4\x8c"=>"C","\xc4\x8e"=>"D","\xc3\x89"=>"E","\xc4\x9a"=>"E","\xc3\x8d"=>"I","\xc4\xbd"=>"L","\xc4\xb9"=>"L","\xc5\x87"=>"N","\xc3\x93"=>"O","\xc3\x96"=>"O","\xc5\x90"=>"O","\xc3\x94"=>"O","\xc5\x98"=>"R","\xc5\x94"=>"R","\xc5\xa0"=>"S","\xc5\xa4"=>"T","\xc3\x9a"=>"U","\xc5\xae"=>"U","\xc3\x9c"=>"U","\xc5\xb0"=>"U","\xc3\x9d"=>"Y","\xc5\xbd"=>"Z");

$nazev_souboru = strtr($nazev_souboru, $utf8table);

Jak to funguje: pole obsahuje písmena s diakritikou zapsaná jako bajty UTF-8 (například "\xc5\xbe" je „ž“) a k nim písmena bez diakritiky. Když funkce strtr dostane pole, nahrazuje celé řetězce, ne jednotlivé bajty, a proto v UTF-8 funguje správně: ze „Žluťoučký kůň“ vznikne „Zlutoucky kun“. Převede ale jen písmena, která v poli jsou (česká, slovenská a několik dalších) – například polské „ł“ nebo německé „ß“ nechá beze změny.


3. varianta (rozšíření intl)
$nazev_souboru = transliterator_transliterate('Any-Latin; Latin-ASCII', $nazev_souboru);
echo transliterator_transliterate('Any-Latin; Latin-ASCII', 'Žluťoučký kůň, łódź, Straße'); // Zlutoucky kun, lodz, Strasse

Funkce transliterator_transliterate převede na písmena bez diakritiky text v libovolném jazyce. Text musí být v UTF-8 a funkce potřebuje rozšíření PHP intl – zda je na serveru zapnuté, ukáže function_exists('transliterator_transliterate').