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
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é. : -)
vous voulez utiliser IU4J. Il comprend l' com.ibm.icu.text.Transliterator
classe, qui apparemment peut faire ce que vous cherchez.
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;
}
j'utilise quelque chose comme ceci:
Transliterator transliterator = Transliterator.getInstance("Any-Latin; Upper; Lower; NFD; [:Nonspacing Mark:] Remove; NFC", Transliterator.FORWARD);