Odháčkování
Autor: Petr FerschmannSnad 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.


(5 hlasů, průměrně: 4.8 z 5)
16. Prosinec 2007 v 20:58
Velmi elegantne riesenie.
16. Prosinec 2007 v 21:07
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
16. Prosinec 2007 v 21:22
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
17. Prosinec 2007 v 00:27
Meril jsi nejak rychlost vuci ostatnim resenim?
17. Prosinec 2007 v 00:30
S drobnym problemem – Normalizer existuje az od verze 1.6.
17. Prosinec 2007 v 07:40
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 :-)
17. Prosinec 2007 v 08:10
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 .
17. Prosinec 2007 v 09:29
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.
17. Prosinec 2007 v 09:36
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.
17. Prosinec 2007 v 09:38
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}]“, “”);
17. Prosinec 2007 v 09:43
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 :-(
18. Únor 2011 v 13:16
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 :-)