SoftEU

Odháčkování

Autor: Petr Ferschmann

Snad každý český programátor narazil na problém odstranění diakritiky z textu (tzv. odháčkování). Pro tyto účely jsem si kdysi vytvořil jednoduchou mapovací tabulku pro znaky v kódování ISO-8859-2.

Nyní jsem v Javě potřeboval něco podobného a našel jsem lepší řešení:


	        String decomposed = java.text.Normalizer.normalize(string, Normalizer.Form.NFD);
	        return  decomposed.replaceAll("\\\\p{InCombiningDiacriticalMarks}+", "");

Celé to funguje tak, že se znak (např. Á) převede na jeho rozloženou (dekomponovanou) formu (např. A ‘). Znak je tedy převeden na dva znaky. Následně se všechny kombinované diakritické znaky odstraní (háčky, čárky, kroužky, …) pomocí regulárního výrazu. Unicodová tabulka obsahuje téměř pro každý znak i jeho přepis na dekomponovanou formu a tak by uvedené řešení mělo fungovat na většinu jazyků světa.

1 Hvězdička2 Hvězdičky3 Hvězdičky4 Hvězdičky5 Hvězdiček (5 hlasů, průměrně: 4.8 z 5)
Načítám ... Načítám ...

12 komentářů k článku “Odháčkování”

  1. peter říká:

    Velmi elegantne riesenie.

  2. tommi říká:

    JJ nieco podobne pouzvam aj ja, aj ked v trocha modifikovanej verzii
    String ret = Normalizer.normalize(originalName.subSequence(0,originalName.length()), Normalizer.Form.NFKD).replaceAll(”[^\\p{ASCII}]“,”");

    a funguje spolahlivo na SK aj CZ

  3. peto říká:

    a ak nepouzivate java 1.6 tak sa to da cez:
    sun.text.Normalizer
    a ak nahodou nemate sun jre, tak pomoze ibm icu:
    http://www.icu-project.org/userguide/Transform.html

  4. finc říká:

    Meril jsi nejak rychlost vuci ostatnim resenim?

  5. Ondrej Svetlik říká:

    S drobnym problemem – Normalizer existuje az od verze 1.6.

  6. Jiří Jakeš říká:

    Tahle věc je úžasná, nedávno jsem ji též objevil. Jen mi malinko vadí, že třída Normalizer je v balíku java.text tuším pouze v Javě 1.6, předtím byla v sun.text. Ještě ja také možnost použít decomposed.replaceAll(”[^\\p{ASCII}]“,”"); pro odstranění všech neASCII znaků (netuším, zda je to ekvivalent). K těm jazykům: skousklo to vietnamštinu, tak už musí všechno :-)

  7. podlesh říká:

    Tuto metodu používám již řadu let. Samozřejmě, pro java.text.Normalizer je k dispozici až od 1.6, takže jsem si vždy musel vygenerovat mapovací tabulku z dat z unicode.org .

  8. petrst říká:

    Chapeau bas! Myslel jsem si, ze Jave a kodovani znaku uz lecos vim, ale o
    dekomponovane forme jsem jeste neslysel. Inu, clovek se musi porad ucit.

  9. Petr Ferschmann říká:

    Jojo, téměř všechny platformy používají složenou formu znaků. Jen MacOS používá pro ukládání znaků na disk rozloženou formu. To je také důvod, proč na něm nefungují v subversion české znaky v názvu souboru.

  10. PetrF říká:

    Tak tohle jsem neznal, nepoužívám (zatím) Java 1.6, tak pro ty co jsou na 1.4 a 1.5:
    sun.text.Normalizer.normalize(text, Normalizer.DECOMP, 0).replaceAll(”[^\\p{ASCII}]“, “”);

  11. Petr Ferschmann říká:

    sun.text.Normalizer byl přesunut do java.text.Normalizer a změnilo se API. Takže je teď oříšek podporovat současně Java 1.6 a 1.5 :-(

  12. Lamanai říká:

    je to mimo téma, ale na zadání “odháčkování” do Google mi stránky SoftEU vyskočily hned jako první, tak se, Petře, nezlob, že to sem dávám, ale přijde mi to vtipné v tom spojení s aférou z posledních dní: http://zpravy.idnes.cz/lecil-zeny-soulozi-rika-studentka-poetrie-o-duchovnim-vudci-jarovi-1pb-/krimi.asp?c=A110126_1521714_olomouc-zpravy_stk :-)


Switch to our mobile site