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.
Velmi elegantne riesenie.
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
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
Meril jsi nejak rychlost vuci ostatnim resenim?
S drobnym problemem – Normalizer existuje az od verze 1.6.
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 🙂
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 .
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.
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.
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}]“, „“);
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 🙁
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 🙂