En Java, est-il possible de vérifier si une chaîne est uniquement ASCII?

Character.isLetter (c) renvoie true si le caractère est une lettre. Mais existe-t-il un moyen de trouver rapidement si une chaîne contient uniquement les caractères de base de l’ASCII?

En utilisant Guava , vous pouvez simplement écrire:

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someSsortingng); 

À partir de Guava 19.0, vous devez utiliser CharMatcher.ascii() place.

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

 import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; public class SsortingngUtils { static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII").newEncoder(); // or "ISO-8859-1" for ISO Latin 1 public static boolean isPureAscii(Ssortingng v) { return asciiEncoder.canEncode(v); } public static void main (Ssortingng args[]) throws Exception { Ssortingng test = "Réal"; System.out.println(test + " isPureAscii() : " + SsortingngUtils.isPureAscii(test)); test = "Real"; System.out.println(test + " isPureAscii() : " + SsortingngUtils.isPureAscii(test)); /* * output : * Réal isPureAscii() : false * Real isPureAscii() : true */ } } 

Détecter le caractère non-ASCII dans une chaîne

Voici une autre manière de ne pas dépendre d’une bibliothèque mais d’utiliser une regex.

Vous pouvez utiliser cette seule ligne:

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

Programme d’exemple complet:

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

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

Les chaînes Java sont conceptuellement encodées en UTF-16. Dans UTF-16, le jeu de caractères ASCII est codé de la manière suivante: les valeurs 0 à 127 et le codage de tout caractère non ASCII (pouvant comporter plus d’un caractère Java) ne sont pas compris entre 0 et 127.

Ou vous copiez le code de la classe IDN .

 // to check if a ssortingng only contains US-ASCII code point // private static boolean isAllASCII(Ssortingng 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; } 

commons-lang3 d’Apache contient des méthodes utiles pour tous les types de «problèmes», y compris celui-ci.

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

essaye ça:

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

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 de ASCII) que vous aimez.

Pause au premier tu n’aimes pas.

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

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(Ssortingng[] args) { Ssortingng testStr = "¤EÀsÆW°ê»Ú®i¶T¤¤¤ß3¼Ó®i¶TÆU2~~KITEC 3/F Rotunda 2"; Ssortingng[] 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; } } 
 //return is uppercase or lowercase public boolean isASCIILetter(char c) { return (c > 64 && c < 91) || (c > 96 && c < 123); }