2013-08-21 4 views
3

Recentrly J'ai trouvé méthode très utile dans la bibliothèque StringUtils qui estSuppression des accents de chaîne

StringUtils.stripAccents(String s) 

je l'ai trouvé vraiment utile avec la suppression de caractères spéciaux et de le convertir en quelque ASCII « équivalent », pour instace s = c

Maintenant, je travaille pour un client allemand qui a vraiment besoin de faire une telle chose, mais seulement pour les caractères non-allemands. Tous les trémas devraient rester intacts. J'ai réalisé que strinAccents ne serait pas utile dans ce cas.

Est-ce que quelqu'un a de l'expérience dans ce domaine? Existe-t-il des outils/bibliothèques/classes utiles ou des expressions régulières? J'ai essayé d'écrire une classe qui est l'analyse et de remplacer ces caractères, mais il peut être très difficile de construire cette carte pour toutes les langues ...

Toutes les suggestions appriciated ...

Répondre

1

Mon intuition me dit que le le moyen le plus simple de le faire consisterait simplement à lister les caractères autorisés et à supprimer les accents de tout le reste. Ce serait quelque chose comme

import java.util.regex.*; 
import java.text.*; 

public class Replacement { 
    private static String patternContainingAllValidGermanCharacters = 
              "a-zA-Z0-9äÄöÖéÉüÜß"; 

    public static void main(String args[]) { 
     String from = "aoeåöäìé"; 
     String result = stripAccentsFromNonGermanCharacters(from); 

     System.out.println("Result: " + result); 
    } 

    public static String stripAccentsFromNonGermanCharacters(
      String from) { 
     Pattern nonGermanCharactersPattern = Pattern.compile(
      "([^" + patternContainingAllValidGermanCharacters + "])"); 

     return stripAccentsFromCharactersMatching(
      from, nonGermanCharactersPattern); 

    } 

    public static String stripAccentsFromCharactersMatching(
     String target, Pattern myPattern) { 

     StringBuffer myStringBuffer = new StringBuffer(); 
     Matcher myMatcher = myPattern.matcher(target); 
     while (myMatcher.find()) { 
      myMatcher.appendReplacement(myStringBuffer, 
       stripAccents(myMatcher.group(1))); 
     } 
     myMatcher.appendTail(myStringBuffer); 

     return myStringBuffer.toString(); 
    } 


    // pretty much the same thing as StringUtils.stripAccents(String s) 
    // used here so I can demonstrate the code without StringUtils dependency 
    public static String stripAccents(String text) { 
     return Normalizer.normalize(text, 
      Normalizer.Form.NFD) 
      .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
    } 
} 

(je réalise le modèle ne contient probablement pas tous les caractères nécessaires, mais ajouter ce qui manque)

0

This peut vous donner un travail autour. Ici vous pouvez détecter la langue et obtenir le texte spécifique seulement.

EDIT: Vous pouvez avoir la chaîne brute en entrée, mettre la détection de langue allemande, puis il détecte les caractères allemands et écarterons le reste.

+0

Il semble avoir la fonctionnalité pour détecter la langue utilisée. Pouvez-vous clarifier comment cela va vous aider? – eis

+0

Vous pouvez avoir la chaîne brute en tant qu'entrée, mettre la détection de la langue en allemand et ensuite détecter les caractères allemands et rejeter le reste –

2

Meilleure construction d'une fonction personnalisée. Cela peut être comme suit. Si vous voulez éviter la conversion d'un caractère, vous pouvez supprimer la relation entre les deux chaînes (les constantes).

private static final String UNICODE = 
     "ÀàÈèÌìÒòÙùÁáÉéÍíÓóÚúÝýÂâÊêÎîÔôÛûŶŷÃãÕõÑñÄäËëÏïÖöÜüŸÿÅåÇçŐőŰű"; 
private static final String PLAIN_ASCII = 
     "AaEeIiOoUuAaEeIiOoUuYyAaEeIiOoUuYyAaOoNnAaEeIiOoUuYyAaCcOoUu"; 

public static String toAsciiString(String str) { 
    if (str == null) { 
     return null; 
    } 
    StringBuilder sb = new StringBuilder(); 
    for (int index = 0; index < str.length(); index++) { 
     char c = str.charAt(index); 
     int pos = UNICODE.indexOf(c); 
     if (pos > -1) 
      sb.append(PLAIN_ASCII.charAt(pos)); 
     else { 
      sb.append(c); 
     } 
    } 
    return sb.toString(); 
} 

public static void main(String[] args) { 
    System.out.println(toAsciiString("Höchstalemannisch")); 
} 
Questions connexes