Conversion Java UTF-8 en ASCII avec suppléments

nous acceptons toutes sortes de caractères nationaux dans la chaîne UTF-8 sur l'entrée, et nous avons besoin de les convertir en chaîne ASCII sur la sortie pour une certaine utilisation d'héritage. (nous n'acceptons pas les caractères chinois et Japonais, seulement les langues européennes)

Nous avons un petit utilitaire pour se débarrasser de tous les signes diacritiques:

public static final String toBaseCharacters(final String sText) {
    if (sText == null || sText.length() == 0)
        return sText;

    final char[] chars = sText.toCharArray();
    final int iSize = chars.length;
    final StringBuilder sb = new StringBuilder(iSize);

    for (int i = 0; i < iSize; i++) {
        String sLetter = new String(new char[] { chars[i] });
        sLetter = Normalizer.normalize(sLetter, Normalizer.Form.NFC);

        try {
            byte[] bLetter = sLetter.getBytes("UTF-8");
            sb.append((char) bLetter[0]);
        } catch (UnsupportedEncodingException e) {
        }
    }
    return sb.toString();
}

la question Est de savoir comment remplacer tous les Sharps allemands (ß, Đ, đ) et autres personnages qui passent par la méthode de normalisation ci-dessus, avec leurs suppléments (en cas de ß, supplément serait probablement "ss" et dans le cas od - supplément serait soit "D" ou "Dj").

y a-t-il un moyen simple de le faire, sans millions de dollars .replaceAll() appelle?

ainsi par exemple: Đonardan = Djonardan, Blaß = Blass et ainsi de suite.

nous pouvons remplacer tous les caractères "problématiques" par de l'espace vide, mais nous aimerions éviter cela pour rendre la sortie aussi similaire que possible à l'entrée.

Merci pour votre les réponses,

Bozo

10
demandé sur bozo 2010-03-30 16:43:19

4 réponses

si vous soutenez seulement les langues européennes, basées sur le Latin, environ 100 devrait être suffisant; c'est certainement faisable: prenez le cartes Unicode Latin-1 Supplement et Latin Étendu-A et obtenir le String.replace partie a commencé. : -)

0
répondu Heinzi 2010-03-30 13:02:01

vous voulez utiliser IU4J. Il comprend l' com.ibm.icu.text.Transliterator classe, qui apparemment peut faire ce que vous cherchez.

2
répondu Thomas Pornin 2010-03-30 13:09:48

Voici mon convertisseur qui utilise lucene...

private final KeywordTokenizer keywordTokenizer = new KeywordTokenizer(new StringReader(""));
private final ASCIIFoldingFilter asciiFoldingFilter = new ASCIIFoldingFilter(keywordTokenizer);
private final TermAttribute termAttribute = (TermAttribute) asciiFoldingFilter.getAttribute(TermAttribute.class);

public String process(String line)
{
    if (line != null)
    {
        try
        {
            keywordTokenizer.reset(new StringReader(line));
            if (asciiFoldingFilter.incrementToken())
            {
                return termAttribute.term();
            }
        }
        catch (IOException e)
        {
            logger.warn("Failed to parse: " + line, e);
        }
    }
    return null;
}
1
répondu neilireson 2011-01-21 22:45:00

j'utilise quelque chose comme ceci:

Transliterator transliterator = Transliterator.getInstance("Any-Latin; Upper; Lower; NFD; [:Nonspacing Mark:] Remove; NFC", Transliterator.FORWARD);
1
répondu Thad Hughes 2012-01-31 15:41:49