Triplet článků věnujících se kódování češtiny (a slovenštiny) ukončím posledním úkolem. A tím je odstranění diakritiky.

Jistě, jedná se o primitivní náhradu sady znaků, na internetu stokrát řešenou. Ale jak jsem psal minule, úspěch stojí na správných převodních tabulkách, na správném vymezení všech znaků s diakritikou. A přesvědčte Richarda Müllera, ať se nechá přejmenovat, když ü v česko-slovenštině neexistuje ;)

Tedy budou nás zajímat tyto znaky s háčkama, čárkama a přehláskama:

malá písmena:
á ä č ď é ě í ľ ĺ ň ó ö ő ô ř ŕ š ť ú ů ü ű ý ž

velká písmena:
Á Ä Č Ď É Ě Í Ľ Ĺ Ň Ó Ö Ő Ô Ř Ŕ Š Ť Ú Ů Ü Ű Ý Ž

Pro převod použijeme funkci strtr(). Ta je nesmírně rychlá, je-li volána s převodními řetězci namísto pole. Toho využijeme u kódování WINDOWS-1250 a ISO-8859-2. Jen v případě UTF-8 budeme muset použít převodní tabulku v podobně asociativního pole.

// WINDOWS-1250 to ASCII for diacritic chars by dgx
function cs_win2ascii($s)
{
	return strtr($s,
		"\xe1\xe4\xe8\xef\xe9\xec\xed\xbe\xe5\xf2\xf3\xf6\xf5\xf4\xf8\xe0\x9a\x9d\xfa\xf9\xfc\xfb\xfd\x9e\xc1\xc4\xc8\xcf\xc9\xcc\xcd\xbc\xc5\xd2\xd3\xd6\xd5\xd4\xd8\xc0\x8a\x8d\xda\xd9\xdc\xdb\xdd\x8e",
		"aacdeeillnoooorrstuuuuyzAACDEEILLNOOOORRSTUUUUYZ"
	);

}


// ISO-8859-2 to ASCII for diacritic chars
function cs_iso2ascii($s)
{
	return strtr($s,
		"\xe1\xe4\xe8\xef\xe9\xec\xed\xb5\xe5\xf2\xf3\xf6\xf5\xf4\xf8\xe0\xb9\xbb\xfa\xf9\xfc\xfb\xfd\xbe\xc1\xc4\xc8\xcf\xc9\xcc\xcd\xa5\xc5\xd2\xd3\xd6\xd5\xd4\xd8\xc0\xa9\xab\xda\xd9\xdc\xdb\xdd\xae",
		"aacdeeillnoooorrstuuuuyzAACDEEILLNOOOORRSTUUUUYZ"
	);

}


// UTF-8 to ASCII for diacritic chars
function cs_utf2ascii($s)
{
	static $tbl = array(...v plném znění v souboru ke stažení...);
	return strtr($s, $tbl);
}

Opět platí, že znaky zapisujeme přenositelně pomocí escape sekvencí. Hotové příklady si můžete stáhnout:

Download charset2ascii

A ještě jeden způsob

Protože odstranění diakritiky je vlastně převyprávěním znaků na jejich ASCII ekvivalenty, můžeme v určitých případech použít i funkci iconv:

$s = iconv('UTF-8', 'ASCII//TRANSLIT', $s);

Mějte na paměti, že iconv vloží do textu znaky jako " ' ^, aby vizuálně diakritiku imitoval. Dále je nutné dát pozor na implementaci iconv – zjistíte ji přes phpinfo(). Zatímco libiconv funguje korektně, glibc nahradí české znaky za otazníky. Může se tak stát, že na jednom hostingu funkce pracuje správě, zatímco na jiném vrací nesmysly.

Každopádně ve funkci iconv se skrývá velmi účinný prostředek, který si hravě poradí s celou řadou dalších neobvyklých żnąků.


Související: