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?
À 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);
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
*/
}
}
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"));
}
}
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
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;
}
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("!@£$%^&!@£$%^"));
essaye ça:
for (char c: string.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 d'ASCII) que vous aimez.
Pause au premier que tu n'aimes pas.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
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}]", "");
}
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;
}
}