web-dev-qa-db-fra.com

Est-il possible de vérifier si une chaîne ne contient que de l'ASCII?

L'appel Character.isLetter(c) renvoie true si le caractère est une lettre. Mais existe-t-il un moyen de trouver rapidement si un String ne contient que les caractères de base de l'ASCII?

108
TambourineMan

À partir de Guava à partir de 19.0, vous pouvez utiliser:

boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);

Ceci utilise la méthode matchesAllOf(someString) qui s'appuie sur la méthode fabrique ascii() plutôt que le singleton maintenant obsolète ASCII .

Ici ASCII inclut tous les ASCII caractères y compris les caractères non imprimables inférieurs à 0x20 (Espace), tels que les tabulations, les lignes et les lignes. feed/return mais aussi BEL avec le code 0x07 et DEL avec le code 0x7F.

Ce code utilise de manière incorrecte des caractères plutôt que des points de code, même si les points de code sont indiqués dans les commentaires des versions antérieures. Heureusement, les caractères requis pour créer un point de code avec une valeur de U+010000 Ou supérieure utilisent deux caractères de substitution avec une valeur en dehors de la plage ASCII. La méthode réussit donc toujours à tester ASCII, même pour les chaînes contenant des emoji.

Pour les versions antérieures de Guava sans la méthode ascii(), vous pouvez écrire:

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
119
ColinD

Vous pouvez le faire avec Java.nio.charset.Charset .

import Java.nio.charset.Charset;

public class StringUtils {

  public static boolean isPureAscii(String v) {
    return Charset.forName("US-ASCII").newEncoder().canEncode(v);
    // or "ISO-8859-1" for ISO Latin 1
    // or StandardCharsets.US_ASCII with JDK1.7+
  }

  public static void main (String args[])
    throws Exception {

     String test = "Réal";
     System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
     test = "Real";
     System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));

     /*
      * output :
      *   Réal isPureAscii() : false
      *   Real isPureAscii() : true
      */
  }
}

Détecter les caractères non-ASCII dans une chaîne

98
RealHowTo

Voici une autre façon de ne pas dépendre d’une bibliothèque mais d’utiliser une expression rationnelle.

Vous pouvez utiliser cette seule ligne:

text.matches("\\A\\p{ASCII}*\\z")

Exemple de programme complet:

public class Main {
    public static void main(String[] args) {
        char nonAscii = 0x00FF;
        String asciiText = "Hello";
        String nonAsciiText = "Buy: " + nonAscii;
        System.out.println(asciiText.matches("\\A\\p{ASCII}*\\z"));
        System.out.println(nonAsciiText.matches("\\A\\p{ASCII}*\\z"));
    }
}
73
Arne Deutsch

Parcourez la chaîne et assurez-vous que tous les caractères ont une valeur inférieure à 128.

Les chaînes de caractères Java sont conceptuellement codées au format UTF-16. En UTF-16, le jeu de caractères ASCII est codé sous les valeurs 0 à 127 et le codage de tout caractère non ASCII (pouvant comporter plusieurs Java char) est garanti de ne pas inclure les nombres 0 - 127

53
JeremyP

Ou vous copiez le code de la classe IDN .

// to check if a string only contains US-ASCII code point
//
private static boolean isAllASCII(String input) {
    boolean isASCII = true;
    for (int i = 0; i < input.length(); i++) {
        int c = input.charAt(i);
        if (c > 0x7F) {
            isASCII = false;
            break;
        }
    }
    return isASCII;
}
14
Zarathustra

commons-lang3 d'Apache contient des méthodes utiles d'utilité/commodité pour toutes sortes de "problèmes", y compris celui-ci.

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
10
fjkjava

essaye ça:

for (char c: string.toCharArray()){
  if (((int)c)>127){
    return false;
  } 
}
return true;
4
pforyogurt

Parcourez la chaîne et utilisez charAt () pour obtenir le caractère. Ensuite, traitez-le comme un int et voyez s'il a une valeur unicode (un sur-ensemble d'ASCII) que vous aimez.

Pause au premier que tu n'aimes pas.

2
private static boolean isASCII(String s) 
{
    for (int i = 0; i < s.length(); i++) 
        if (s.charAt(i) > 127) 
            return false;
    return true;
}
1
fdsfdsfdsfds

Ceci renverra true si String ne contient que ASCII) et false s'il ne le fait pas.

Charset.forName("US-ASCII").newEncoder().canEncode(str)

Si vous souhaitez supprimer non ASCII, voici l'extrait de code:

if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
                        str = str.replaceAll("[^\\p{ASCII}]", "");
                    }
0
mike oganyan

C'était possible. Joli problème.

import Java.io.UnsupportedEncodingException;
import Java.nio.charset.Charset;
import Java.nio.charset.CharsetEncoder;

public class EncodingTest {

    static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII")
            .newEncoder();

    public static void main(String[] args) {

        String testStr = "¤EÀsÆW°ê»Ú®i¶T¤¤¤ß3¼Ó®i¶TÆU2~~KITEC 3/F Rotunda 2";
        String[] strArr = testStr.split("~~", 2);
        int count = 0;
        boolean encodeFlag = false;

        do {
            encodeFlag = asciiEncoderTest(strArr[count]);
            System.out.println(encodeFlag);
            count++;
        } while (count < strArr.length);
    }

    public static boolean asciiEncoderTest(String test) {
        boolean encodeFlag = false;
        try {
            encodeFlag = asciiEncoder.canEncode(new String(test
                    .getBytes("ISO8859_1"), "BIG5"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return encodeFlag;
    }
}
0
user3614583