L'appel Character.isLetter(c)
revient true
si le caractère est une lettre. Mais y a-t-il un moyen de trouver rapidement si a String
ne contient que les caractères de base de l'ASCII?
la source
L'appel Character.isLetter(c)
revient true
si le caractère est une lettre. Mais y a-t-il un moyen de trouver rapidement si a String
ne contient que les caractères de base de l'ASCII?
À partir de Guava 19.0, vous pouvez utiliser:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Cela utilise la matchesAllOf(someString)
méthode qui repose sur la méthode de fabrique ascii()
plutôt que sur le ASCII
singleton désormais obsolète .
Ici ASCII inclut tous les caractères ASCII y compris les caractères non imprimables inférieurs à 0x20
(espace) tels que les tabulations, le saut de ligne / retour mais aussi BEL
avec code 0x07
et DEL
avec code 0x7F
.
Ce code utilise de manière incorrecte des caractères plutôt que des points de code, même si des 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 plus utilisent deux caractères de substitution avec une valeur en dehors de la plage ASCII. Ainsi, la méthode réussit toujours à tester l'ASCII, même pour les chaînes contenant des emoji.
Pour les versions antérieures de Guava sans la ascii()
méthode, vous pouvez écrire:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
est obsolète maintenant et sur le point d'être supprimée en juin 2018.Vous pouvez le faire avec java.nio.charset.Charset .
Détecter les caractères non ASCII dans une chaîne
la source
StandardCharsets.US_ASCII
place deCharset.forName("US-ASCII")
.StandardCharsets
? Je pourrais poster une autre réponse mais je préfère corriger cette réponse très appréciée.Voici une autre façon de ne pas dépendre d'une bibliothèque mais d'utiliser une regex.
Vous pouvez utiliser cette seule ligne:
Exemple de programme complet:
la source
\P{Print}
et\P{Graph}
+ une description? Pourquoi avez-vous besoin\A
et\z
?Parcourez la chaîne et assurez-vous que tous les caractères ont une valeur inférieure à 128.
Les chaînes Java sont codées conceptuellement en UTF-16. En UTF-16, le jeu de caractères ASCII est codé comme les valeurs 0 à 127 et le codage de tout caractère non ASCII (qui peut être composé de plus d'un caractère Java) est garanti de ne pas inclure les nombres 0 à 127
la source
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
car les 32 premières valeurs du codage 7 bits sont des caractères de contrôle et la valeur finale (0x7F) estDEL
.Ou vous copiez le code de la classe IDN .
la source
return false
au lieu d'utiliserisASCII = false
etbreak
.commons-lang3 d'Apache contient de précieuses méthodes utilitaires / pratiques pour toutes sortes de «problèmes», y compris celui-ci.
la source
essaye ça:
la source
Parcourez la chaîne et utilisez charAt () pour obtenir le char. Traitez-le ensuite comme un entier et voyez s'il a une valeur unicode (un sur-ensemble d'ASCII) que vous aimez.
Pause au début que vous n'aimez pas.
la source
la source
charAt
renvoie unchar
. Pouvez-vous tester directement si un typechar
est supérieur à un int sans d'abord être converti en un int, ou votre test effectue-t-il automatiquement la conversion? Peut-être que vous pouvez et peut-être que oui? Je suis allé de l' avant et a converti ce à un int comme ceci:if ((int)s.charAt(i) > 127)
. Je ne sais pas si mes résultats sont différents, mais je me sens mieux de le laisser fonctionner. Nous verrons: - \C'était possible. Joli problème.
la source
Cela renverra true si String ne contient que des caractères ASCII et false dans le cas contraire
Si vous souhaitez supprimer non ASCII, voici l'extrait de code:
la source
la source