Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Translate to English… Ins Deutsche übersetzen…

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í:

napsáno 26. 6. 2006 | shlédnuto 14292x | nahoru

Komentáře RSS 2.0 komentářů » přidat

#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

$url = preg_replace('~[^-a-z0-9_]+~', '', $url);

jak píše Jakub Vrána.

Posláno 26. 6. 2006 v 11.53 | Odpovědět
Na komentář reagoval [4] David Grudl

#2 dizzyn http://mobilovinky.cz nový

U nás v javě se to dělá takto:

String temp = Normalizer.normalize(vstup, Normalizer.DECOMP, 0);
return temp.replaceAll("[^\\p{ASCII}]", "");

Je to vypečenost prvního řádu

Posláno 26. 6. 2006 ve 13.01 | Odpovědět
avatar

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

Posláno 26. 6. 2006 ve 13.14 | Odpovědět
Na komentář reagoval [4] David Grudl
avatar

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

Posláno 26. 6. 2006 ve 13.46 | Odpovědět
Na komentář reagoval [5] error414
avatar

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

Posláno 26. 6. 2006 ve 13.54 | Odpovědět
Na komentář reagoval [6] rarouš [8] David Grudl
avatar

#6 rarouš http://www.rarous.net/ nový

#5 error414: ty nemáš klimatizaci? :)

Posláno 26. 6. 2006 ve 14.04 | Odpovědět
Na komentář reagoval [7] error414
avatar

#7 error414 http://www.error414.com/ nový

#6 rarouš: ne ja nemam klimatizaci, asi sem pak menecenej :-)

Posláno 26. 6. 2006 ve 14.17 | Odpovědět
avatar

#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

Posláno 26. 6. 2006 ve 14.21 | Odpovědět
Na komentář reagoval [15] DJ.Maca
avatar

#9 llook http://llook.wz.cz/weblog/ nový

A pročpak se omezovat na středoevropské znaky? http://nuvio.cz/…vod-php.html

Posláno 26. 6. 2006 v 15.24 | Odpovědět
avatar

#10 QuickShare http://blog.msvetlik.com nový

Tebe to kódování nějak vzalo poslyš

Posláno 26. 6. 2006 v 16.25 | Odpovědět

#11 lukas nový

Ve zdrojaku Wordpressu je celkem fajn tabulka, reasi treb a i konverzi toho cileneho znaku AE na [A][E].

Posláno 26. 6. 2006 v 16.52 | Odpovědět
Na komentář reagoval [16] Mormegil

#12 alian http://alian.info nový

veľmi pekné a užitočné :)
idem skúsiť…

Posláno 26. 6. 2006 v 18.28 | Odpovědět

#13 DJ.Maca http://www.deep-jungle.eu nový

A co tak pouzit multibyte string knihovnu misto iconv?

Posláno 26. 6. 2006 ve 21.53 | Odpovědět
Na komentář reagoval [14] David Grudl
avatar

#14 David Grudl http://davidgrudl.com nový

#13 DJ.Maca: k čemu konkrétně?

Posláno 27. 6. 2006 ve 4.24 | Odpovědět
Na komentář reagoval [15] DJ.Maca

#15 DJ.Maca http://www.deep-jungle.eu nový

#14 David Grudl: To mela byt odpoved na vase upozorneni chyby v #8 David Grudl:.

Posláno 27. 6. 2006 v 11.04 | Odpovědět

#16 Mormegil nový

#11 lukas: Probůh, tohle nehledejte ve zdrojácích různých softwarů, ale v databázi znaků Unicode!

Posláno 27. 6. 2006 v 15.14 | Odpovědět

#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ě)

Posláno 28. 6. 2006 v 8.49 | Odpovědět

#18 dzidzir nový

Jejda, zapomeňte na tu blbost s ë ;) – kvuli tomu jem zapoměl na ö → oe…

Posláno 28. 6. 2006 v 9.00 | Odpovědět
avatar

#19 peCan http://pecan.cz nový

dík, zrovna jsem to chtěl řešit.

Posláno 29. 6. 2006 v 8.49 | Odpovědět

#20 urso nový

Nejlepší program na
odstranění češtiny a konverze českých znaků je podle mne PREKODÉR.

Posláno 3. 2. 2008 v 18.32 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

phpFashion © 2004, 2012 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.