web-dev-qa-db-fra.com

Comment convertir UTF-8 en US-Ascii dans Java

Nous avons un système où les clients, principalement européens saisissent des textes (en UTF-8) qui doivent être distribués à différents systèmes, la plupart acceptant UTF-8, mais maintenant nous devons également distribuer les textes à un système américain qui n'accepte que les États-Unis. -Ascii 7 bits

Nous devons donc maintenant traduire tous les caractères européens en US-Ascii le plus proche. Existe-t-il des bibliothèques Java pour vous aider dans cette tâche?

En ce moment, nous venons de commencer à ajouter à une table de traduction, où Å (suédois AA) -> A et ainsi de suite et où nous ne trouvons aucune correspondance pour un caractère entré, nous l'enregistrerons et le remplacerons par un point d'interrogation et essayez de corriger cela pour la prochaine version, mais cela semble très inefficace et quelqu'un d'autre doit avoir fait quelque chose de similaire auparavant.

26
Ulf Lindback

Le programme ni2ascii est écrit en C, mais vous pourriez probablement le convertir en Java avec peu d'effort. Il contient un grand tableau d'approximations (implicitement, dans le commutateur- déclarations de cas).

Sachez qu'il n'y a pas d'approximations universellement acceptées: les Allemands veulent que vous remplaciez Ä par AE, les Finlandais et les Suédois préfèrent juste A. Votre exemple de Å n'est pas évident non plus: les Suédois abandonneraient probablement l'anneau et utiliser A, mais les Danois et les Norvégiens pourraient mieux apprécier le AA historiquement plus correct.

19
Jouni K. Seppänen

Vous pouvez le faire avec ce qui suit (à partir de l'exemple NFD dans ce Core Java Technology Tech Tip ):

public static String decompose(String s) {
    return Java.text.Normalizer.normalize(s, Java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","");
}
36
Simon Lieschke

Au lieu de créer votre propre tableau, vous pouvez convertir le texte au format de normalisation D, où les caractères sont représentés comme un caractère de base plus les signes diacritiques (par exemple, "á" sera remplacé par "a" suivi d'un accent aigu combiné) ). Vous pouvez ensuite supprimer tout ce qui n'est pas une lettre ASCII.

Les tables existent toujours, mais sont désormais celles du standard Unicode.

Vous pouvez également essayer NFKD au lieu de NFD, pour attraper encore plus de cas.

Références:

6
CesarB

En réponse à réponse donnée par Joe Liversedge , le Lucene référencé ISOLatin1AccentFilter n'existe plus :

Il a été remplacé par org.Apache.lucene.analysis.ASCIIFoldingFilter :

Cette classe convertit les caractères Unicode alphabétiques, numériques et symboliques qui ne sont pas dans les 127 premiers ASCII caractères (le bloc Unicode "Latin de base") en leur ASCII équivalents, s'il y en a un. Les caractères des blocs Unicode suivants sont convertis; cependant, seuls les caractères avec des choix ASCII alternatives sont convertis.

FYI -

5
Matt Storer

Ceci est généralement utile dans les applications de recherche. Voir l'implémentation correspondante de Lucene ISOLatin1AccentFilter . Ce n'est pas vraiment conçu pour se connecter à une implémentation locale aléatoire, mais fait l'affaire.

2
Joe Liversedge

Il existe des fonctions intégrées pour ce faire. La classe principale impliquée est CharsetEncoder , qui fait partie du package nio. Une manière plus simple est String.getBytes(Charset) qui peut être envoyée à un ByteArrayOutputStream .

0
sblundy