2016-04-14 13 views
1

Java 1.5 kullanıyorum aksanlı karakterleri dönüştürmek ve ben (bu aeiou ---> aeiou gibi) String normalleştirmek gerekiyor. Normalizer kullanamıyorum çünkü> 1.6 Herhangi bir fikir var mı?Nasıl Java

Bu denedim: Eğer Normaliser kullanamazsınız

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

bunu test etmedim ama belki [Bu cevap] (http://stackoverflow.com/a/10831704/1682559) işe yarayabilir. Java 6 için çalışması gerektiğini belirtiyor. Cevabında açıklandığı gibi, dönüştürmek istediğiniz karakterlerin aralığını ve sıralarını bilmeniz gerekiyor. –

+0

Ne korkunç bir kod parçası ... nereden aldın? Tamamen gereksiz yere yansıtma kullanır, bu da programın gerekenden daha karmaşık ve verimsiz bir düzene sahip olmasını sağlar. Ve Java 6 sınıfı 'java.text.Normalizer'ın Java 5 üzerinde çalışmasını sihirli bir şekilde yapmayacaktır. – Jesper

cevap

1

durumda kendi yöntem

olun, ayrıca olası tüm koymak Map kullanarak güzel bir yol olurdu normalleştirilecek harflerin varyasyonları.

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

Bu oldukça uzun ve korkunç, bu nedenle bir metin dosyasından yükleme daha iyidir.


Zaten mevcut cevabı ben answer aşağıdaki bulduk bu page At

. Ben bunu test ettik, çalışır: 00C0 den Unicode tablonun

Ayna aksan olmadan 017f için. aksan olmadan

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

İade dize - 7 bitlik yaklaşım.

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); 
}