La llamada Character.isLetter(c)
regresa true
si el personaje es una letra. Pero, ¿hay alguna manera de encontrar rápidamente si a String
solo contiene los caracteres base de ASCII?
fuente
La llamada Character.isLetter(c)
regresa true
si el personaje es una letra. Pero, ¿hay alguna manera de encontrar rápidamente si a String
solo contiene los caracteres base de ASCII?
Desde Guava 19.0 en adelante, puede usar:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Esto utiliza el matchesAllOf(someString)
método que se basa en el método de fábrica en ascii()
lugar del ASCII
singleton ahora obsoleto .
Aquí ASCII incluye todos los caracteres ASCII, incluidos los caracteres no imprimibles inferiores a 0x20
(espacio) como tabulaciones, salto de línea / retorno, pero también BEL
con código 0x07
y DEL
con código 0x7F
.
Este código utiliza incorrectamente caracteres en lugar de puntos de código, incluso si los puntos de código se indican en los comentarios de versiones anteriores. Afortunadamente, los caracteres necesarios para crear un punto de código con un valor de U+010000
o superior utilizan dos caracteres sustitutos con un valor fuera del rango ASCII. Entonces, el método aún tiene éxito en la prueba de ASCII, incluso para cadenas que contienen emoji.
Para versiones anteriores de Guava sin el ascii()
método, puede escribir:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
está en desuso ahora y a punto de eliminarse en junio de 2018.Puede hacerlo con java.nio.charset.Charset .
Detectar caracteres no ASCII en una cadena
fuente
StandardCharsets.US_ASCII
lugar deCharset.forName("US-ASCII")
.StandardCharsets
? Podría publicar otra respuesta, pero prefiero arreglar esta respuesta muy apreciada.Aquí hay otra forma que no depende de una biblioteca, sino que usa una expresión regular.
Puede utilizar esta única línea:
Programa de ejemplo completo:
fuente
\P{Print}
y\P{Graph}
+ una descripción? ¿Por qué necesitas\A
y\z
?Repita la cadena y asegúrese de que todos los caracteres tengan un valor menor que 128.
Las cadenas de Java están codificadas conceptualmente como UTF-16. En UTF-16, el conjunto de caracteres ASCII se codifica con los valores 0-127 y se garantiza que la codificación de cualquier carácter no ASCII (que puede constar de más de un carácter Java) no incluye los números 0-127.
fuente
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
ya que los primeros 32 valores de la codificación de 7 bits son caracteres de control y el valor final (0x7F) esDEL
.O copia el código de la clase IDN .
fuente
return false
lugar de usarisASCII = false
ybreak
.commons-lang3 de Apache contiene valiosos métodos de utilidad / conveniencia para todo tipo de "problemas", incluido este.
fuente
prueba esto:
fuente
Repita la cadena y use charAt () para obtener el char. Luego trátelo como un int y vea si tiene un valor Unicode (un superconjunto de ASCII) que le guste.
Rompe a la primera que no te guste.
fuente
fuente
charAt
devuelve unchar
. ¿Puedes probar directamente si un tipochar
es mayor que un int sin convertirlo a un int, primero, o tu prueba hace la cobertura automáticamente? ¿Quizás puedas y quizás sí? Seguí adelante y convertido a un int este modo:if ((int)s.charAt(i) > 127)
. No estoy seguro de si mis resultados son diferentes, pero me siento mejor al dejarlo correr. Veremos: - \Era posible. Bastante problema.
fuente
Esto devolverá verdadero si String solo contiene caracteres ASCII y falso cuando no los contiene
Si desea eliminar no ASCII, aquí está el fragmento:
fuente
fuente