2016-04-14 19 views
1

私はJava 1.5を使用しています。文字列 (thisàèìòù---> aeiou)を正規化する必要があります。ノーマライザは使用できません> 1.6>のためです アイデアはありますか?アクセント記号付きの文字をJavaで変換する方法

私はこれを試してみた:

public String normalizeText(String text) { 
     text = normalizer(text); 
    text = text.replaceAll("\\p{InCombiningDiacriticalMarks}]", ""); 
    return text; 

} 

public static String normalizer(String word) { 
    try { 
     int i; 
     Class<?> normalizerClass = Class.forName("java.text.Normalizer"); 
     Class<?> normalizerFormClass = null; 
     Class<?>[] nestedClasses = normalizerClass.getDeclaredClasses(); 
     for (i = 0; i < nestedClasses.length; i++) { 
      Class<?> nestedClass = nestedClasses[i]; 
      if (nestedClass.getName().equals("java.text.Normalizer$Form")) { 
       normalizerFormClass = nestedClass; 
      } 
     } 
     assert normalizerFormClass.isEnum(); 
     Method methodNormalize = normalizerClass.getDeclaredMethod(
       "normalize", 
       CharSequence.class, 
       normalizerFormClass); 
     Object nfcNormalization = null; 
     Object[] constants = normalizerFormClass.getEnumConstants(); 
     for (i = 0; i < constants.length; i++) { 
      Object constant = constants[i]; 
      if (constant.toString().equals("NFC")) { 
       nfcNormalization = constant; 
      } 
     } 
     return (String) methodNormalize.invoke(null, word, nfcNormalization); 
    } catch (Exception ex) { 
     return null; 
    } 
+0

私はそれをテストしていませんが、おそらく[この答え](http://stackoverflow.com/a/10831704/1682559は)うまくいくかもしれません。これは、プレJava 6で動作するはずだと述べています。答えに説明されているように、変換する文字の範囲とその順序を知る必要があります。 –

+0

コードの恐ろしい部分はどこから取得しましたか?それは完全に不必要に反射を使用し、プログラムを必要以上に複雑で非効率的にします。そして、Java 6クラス 'java.text.Normalizer'をJava 5で動作させることは魔法のようには進んでいません。 – Jesper

答えて

1

あなたがNormaliserを使用することはできません場合は、独自の方法

を行い、また、あなたが可能なすべて入れMapを使用して良い方法、があると思います正規化する文字のバリエーション。

HashMap<Character, Character> rep = new HashMap<>(); 
rep.put("à","a"); 
rep.put("è","e"); 
rep.put("ì","i"); 
rep.put("ò","o"); 
rep.put("ù","u"); 
// etc... 

これはかなり長くてひどいので、テキストファイルからの読み込みが優れています。


既存の答え私はanswer次を発見した。このpage

。それは動作します、私はそれをテストしました:

区別することなく00c0から017fまでのユニコードテーブルのミラー。

private static final String tab00c0 = "AAAAAAACEEEEIIII" + 
    "DNOOOOO\u00d7\u00d8UUUUYI\u00df" + 
    "aaaaaaaceeeeiiii" + 
    "\u00f0nooooo\u00f7\u00f8uuuuy\u00fey" + 
    "AaAaAaCcCcCcCcDd" + 
    "DdEeEeEeEeEeGgGg" + 
    "GgGgHhHhIiIiIiIi" + 
    "IiJjJjKkkLlLlLlL" + 
    "lLlNnNnNnnNnOoOo" + 
    "OoOoRrRrRrSsSsSs" + 
    "SsTtTtTtUuUuUuUu" + 
    "UuUuWwYyYZzZzZzF"; 

発音区別符号なし戻り値文字列 - 7ビットの近似値。

public static String removeDiacritic(String source) { 
    char[] vysl = new char[source.length()]; 
    char one; 
    for (int i = 0; i < source.length(); i++) { 
     one = source.charAt(i); 
     if (one >= '\u00c0' && one <= '\u017f') { 
      one = tab00c0.charAt((int) one - '\u00c0'); 
     } 
     vysl[i] = one; 
    } 
    return new String(vysl); 
} 
関連する問題