Odháčkování

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.

12 thoughts on “Odháčkování”

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

  2. 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 🙂

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

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

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

  6. 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}]“, „“);

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *