Вызов Символ. isLetter (c)
возвращает true
, если символ является буквой. Но есть ли способ быстро найти, если строка
содержит только базовые символы ASCII?
Начиная с Guava 19.0, вы можете использовать:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Здесь используется метод matchAllOf(someString)
, который опирается на фабричный метод . ] ascii()
вместо устаревшего ASCII
синглтона.
Здесь ASCII включает все символы ASCII , включая непечатаемые символы ниже 0x20
(пробел), такие как табуляция, перевод строки / возврат, а также BEL
. ] с кодом 0x07
и DEL
с кодом 0x7F
.
Этот код неправильно использует символы, а не кодовые точки, даже если кодовые точки указаны в комментариях к более ранним версиям. К счастью, символы, необходимые для создания кодовой точки со значением U+010000
или более, используют два суррогатных символа со значением за пределами диапазона ASCII. Таким образом, метод по-прежнему успешно проверяет ASCII даже для строк, содержащих смайлики.
Для более ранних версий Guava без метода ascii()
вы можете написать:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
Повторите строку и убедитесь, что все символы имеют значение меньше 128.
Строки Java концептуально кодируются как UTF-16. В UTF-16 набор символов ASCII кодируется как значения от 0 до 127, а кодировка любого символа, отличного от ASCII (который может состоять из более чем одного символа Java), гарантированно не включает числа от 0 до 127
.Вот еще один способ, не зависящий от библиотеки, но использующий регулярное выражение.
Вы можете использовать эту единственную строку:
text.matches("\\A\\p{ASCII}*\\z")
Вся пример программы:
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"));
}
}
Повторите строку и используйте charAt() для получения символа. Затем обработайте его как int и посмотрите, есть ли у него значение Unicode (надмножество ASCII), которое вам нравится.
Разбейте первое, что вам не нравится.
Вы можете сделать это с помощью 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
*/
}
}