Comment convertir UTF-8 en US-Ascii en Java

Nous avons un système où les clients, principalement européens, entrent des textes (en UTF-8) qui doivent être dissortingbués à différents systèmes, la plupart acceptant UTF-8, mais nous devons maintenant dissortingbuer les textes à un système américain -Ascii 7 bits

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

En ce moment nous avons juste commencé à append à une table de traduction, où Å (AA suédois) -> A et ainsi de suite et où nous ne trouvons aucune correspondance pour un caractère entré, nous le connecterons et 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 a dû faire quelque chose de similaire auparavant.

    Le programme uni2ascii est écrit en C, mais vous pourriez probablement le convertir en Java sans trop d’effort. Il contient une grande table d’approximations (implicitement, dans les instructions switch-case).

    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 vont probablement laisser tomber l’anneau et utiliser A, mais les Danois et Les Norvégiens aimeraient mieux les AA historiquement plus corrects.

    Vous pouvez le faire avec les éléments suivants (à partir de l’exemple NFD de ce conseil technique sur les technologies Java de base ):

    public static Ssortingng decompose(Ssortingng s) { return java.text.Normalizer.normalize(s, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+",""); } 

    Au lieu de créer votre propre table, vous pouvez convertir le texte en formulaire de normalisation D, où les caractères sont représentés par un caractère de base plus les signes diacritiques (par exemple, “á” sera remplacé par “a” suivi d’un accent aigu combinant ). Vous pouvez alors effacer tout ce qui n’est pas une lettre ASCII.

    Les tables existent toujours, mais sont maintenant celles du standard Unicode.

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

    Les références:

    En réponse à la réponse donnée par Joe Liversedge , le fichier Lucene ISOLatin1AccentFilter référencé 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 figurent pas dans les 127 premiers caractères ASCII (le bloc Unicode “Basic Latin”) en leurs équivalents ASCII, le cas échéant. Les caractères des blocs Unicode suivants sont convertis. Cependant, seuls les caractères avec des alternatives ASCII raisonnables sont convertis.

    FYI –

    Ceci est généralement utile dans les applications de recherche. Voir l’implémentation Lucene ISOLatin1AccentFilter correspondante. Ce n’est pas vraiment conçu pour être connecté à une implémentation locale aléatoire, mais fait le tour.

    Certaines fonctions intégrées permettent de faire cela. La classe principale impliquée est CharsetEncoder , qui fait partie du paquet nio . Ssortingng.getBytes(Charset) peut être envoyé à un object ByteArrayOutputStream .

    new Ssortingng (“½” .getBytes (“US-ASCII”))

    c’est ce que j’utilise:

      

    C’est ce qui semble fonctionner:

     private synchronized static Ssortingng utftoasci(Ssortingng s){ final SsortingngBuffer sb = new SsortingngBuffer( s.length() * 2 ); final SsortingngCharacterIterator iterator = new SsortingngCharacterIterator( s ); char ch = iterator.current(); while( ch != SsortingngCharacterIterator.DONE ){ if(Character.getNumericValue(ch)>0){ sb.append( ch ); }else{ boolean f=false; if(Character.toSsortingng(ch).equals("Ê")){sb.append("E");f=true;} if(Character.toSsortingng(ch).equals("È")){sb.append("E");f=true;} if(Character.toSsortingng(ch).equals("ë")){sb.append("e");f=true;} if(Character.toSsortingng(ch).equals("é")){sb.append("e");f=true;} if(Character.toSsortingng(ch).equals("è")){sb.append("e");f=true;} if(Character.toSsortingng(ch).equals("è")){sb.append("e");f=true;} if(Character.toSsortingng(ch).equals("Â")){sb.append("A");f=true;} if(Character.toSsortingng(ch).equals("ä")){sb.append("a");f=true;} if(Character.toSsortingng(ch).equals("ß")){sb.append("ss");f=true;} if(Character.toSsortingng(ch).equals("Ç")){sb.append("C");f=true;} if(Character.toSsortingng(ch).equals("Ö")){sb.append("O");f=true;} if(Character.toSsortingng(ch).equals("º")){sb.append("");f=true;} if(Character.toSsortingng(ch).equals("Ó")){sb.append("O");f=true;} if(Character.toSsortingng(ch).equals("ª")){sb.append("");f=true;} if(Character.toSsortingng(ch).equals("º")){sb.append("");f=true;} if(Character.toSsortingng(ch).equals("Ñ")){sb.append("N");f=true;} if(Character.toSsortingng(ch).equals("É")){sb.append("E");f=true;} if(Character.toSsortingng(ch).equals("Ä")){sb.append("A");f=true;} if(Character.toSsortingng(ch).equals("Å")){sb.append("A");f=true;} if(Character.toSsortingng(ch).equals("ä")){sb.append("a");f=true;} if(Character.toSsortingng(ch).equals("Ü")){sb.append("U");f=true;} if(Character.toSsortingng(ch).equals("ö")){sb.append("o");f=true;} if(Character.toSsortingng(ch).equals("ü")){sb.append("u");f=true;} if(Character.toSsortingng(ch).equals("á")){sb.append("a");f=true;} if(Character.toSsortingng(ch).equals("Ó")){sb.append("O");f=true;} if(Character.toSsortingng(ch).equals("É")){sb.append("E");f=true;} if(!f){ sb.append("?"); } } ch = iterator.next(); } return sb.toSsortingng(); }