2016-04-14 14 views
1
konvertieren

Ich benutze Java 1.5 und ich muss einen String (wie dieser àìò ---> aeiou) normalisieren. Ich kann Normalizer nicht verwenden, weil> 1,6 Irgendwelche Ideen?Wie akzentuierte Zeichen in Java

Ich habe versucht, dies:

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

ich es nicht getestet haben, aber vielleicht [diese Antwort] (http://stackoverflow.com/a/10831704/1682559) funktionieren könnte. Es besagt, dass es für Pre-Java 6 funktionieren sollte. Sie müssen jedoch den Bereich der Zeichen, die Sie konvertieren möchten, und ihre Reihenfolge wissen, wie in der Antwort erläutert. –

+0

Was für ein schreckliches Stück Code ... wo hast du das her? Es benutzt völlig unnötigerweise die Reflexion, was das Programm um eine Größenordnung komplizierter und ineffizienter als notwendig macht. Und es ist nicht magisch, dass die Java 6-Klasse 'java.text.Normalizer' auf Java 5 funktioniert. – Jesper

Antwort

1

Ihre eigene Methode Machen

Falls Sie nicht Normaliser verwenden können, würde es auch Map mit sein eine schöne Art und Weise, in der Sie alle möglichen setzen Variationen von Buchstaben zu normalisieren.

Das ist ziemlich lang und schrecklich, so dass das Laden aus einer Textdatei besser ist.


Bereits Antwort bestehende

Zu diesem page ich folgendes answer gefunden haben. Es funktioniert, ich habe es getestet:

Spiegel der Unicode-Tabelle von 00c0 bis 017f ohne diakritische Zeichen.

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

Returns String ohne diakritische Zeichen - 7-Bit-Approximation.

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