Odstranění diakritiky z různých kódování
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í:
Komentáře
» přidat
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.

#1 Borek http://borber.com/blog/ nový
Pokud je k dispozici iconv, nejvíc se mi líbí ono „převyprávění“, protože tam se nedá zapomenout na žádný znak. Pokud ostranění diakritiky slouží třeba k vytvoření URL, mělo by ještě následovat
jak píše Jakub Vrána.
#2 dizzyn http://mobilovinky.cz nový
U nás v javě se to dělá takto:
Je to vypečenost prvního řádu
#3 error414 http://www.error414.com/ nový
To DGX: PLS – muřes ktěm ukázkám kódu dát číslo verze?
Třeba něco napíšeš nějaký k=od a dáš tomu verzi 1.0, potom neco změníš a dáš tomu verzi 1.1 a tak dále.
Už se zacínam ztrácet.
Ale je to jen na tobě. Ja už mam na tvoje sriptíky vytvořen modul CVS.
#4 David Grudl http://davidgrudl.com nový
#1 Borek: ano, na generován URL je iconv jak stvořený
#3 error414: to číslo verze najdeš v hlavičce každého souboru.
#5 error414 http://www.error414.com/ nový
#4 David Grudl: Ja myslel vtech ukazkach rovnou v clanku zobrazenych.
Ale je takove horko ze chapu ze se do niceho nechce.
#6 rarouš http://www.rarous.net/ nový
#5 error414: ty nemáš klimatizaci? :)
#7 error414 http://www.error414.com/ nový
#6 rarouš: ne ja nemam klimatizaci, asi sem pak menecenej
#8 David Grudl http://davidgrudl.com nový
#5 error414: takové úpravy dělám hodně výjimečně. Asi myslíš úpravu RE v AutoCzech – tam jsem dal tučně Aktualizace do článku i komentářů. Toho si spíš někdo všimne, než změny čísla verze.
V souvislosti s unicode mě napadá, dávejte si pozor na iconv_substr
#9 llook http://llook.wz.cz/weblog/ nový
A pročpak se omezovat na středoevropské znaky? http://nuvio.cz/…vod-php.html
#10 QuickShare http://blog.msvetlik.com nový
Tebe to kódování nějak vzalo poslyš
#11 lukas nový
Ve zdrojaku Wordpressu je celkem fajn tabulka, reasi treb a i konverzi toho cileneho znaku AE na [A][E].
#12 alian http://alian.info nový
veľmi pekné a užitočné :)
idem skúsiť…
#13 DJ.Maca http://www.deep-jungle.eu nový
A co tak pouzit multibyte string knihovnu misto iconv?
#14 David Grudl http://davidgrudl.com nový
#13 DJ.Maca: k čemu konkrétně?
#15 DJ.Maca http://www.deep-jungle.eu nový
#14 David Grudl: To mela byt odpoved na vase upozorneni chyby v #8 David Grudl:.
#16 Mormegil nový
#11 lukas: Probůh, tohle nehledejte ve zdrojácích různých softwarů, ale v databázi znaků Unicode!
#17 dzidzir nový
Jen možná jedna drobnost, přehlasovaná pismena bez diakritiky se obvykle přepisují ä, ü → ae, ue (nevim, jak ë, to moc časté není – viděl jsem takový znak akorát kdysi v ruštině)
#18 dzidzir nový
Jejda, zapomeňte na tu blbost s ë ;) – kvuli tomu jem zapoměl na ö → oe…
#19 peCan http://pecan.cz nový
dík, zrovna jsem to chtěl řešit.
#20 urso nový
Nejlepší program na
odstranění češtiny a konverze českých znaků je podle mne PREKODÉR.