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

dělá z mužů hackery a z adminů nezaměstnané

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

Karma body: 52. Líbil se vám článek?

Komentáře » přidat

  1. [1] Borek: 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. [2] dizzyn: 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
  3. avatar [3] error414: 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
  4. avatar [4] David Grudl: 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
  5. avatar [5] error414: 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š
    Na komentář reagoval [8] David Grudl
  6. avatar [6] rarouš: nový

    [5] error414: ty nemáš klimatizaci? :)

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

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

    Posláno 26. 6. 2006 ve 14.17 | Odpovědět
  8. avatar [8] David Grudl: 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
  9. avatar [9] llook: 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
  10. avatar [10] QuickShare: nový

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

    Posláno 26. 6. 2006 v 16.25 | Odpovědět
  11. [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. [12] alian: nový

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

    Posláno 26. 6. 2006 v 18.28 | Odpovědět
  13. [13] DJ.Maca: 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
  14. avatar [14] David Grudl: 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. [15] DJ.Maca: 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. [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. [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. [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
  19. avatar [19] peCan: nový

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

    Posláno 29. 6. 2006 v 8.49 | Odpovědět
  20. [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 ani hlasovat

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

La Trine © 2004, 2008 David Grudl – o webu

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

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