Вызов Character.isLetter(c)
возвращается, true
если символ является буквой. Но есть ли способ быстро определить, String
содержит ли a только базовые символы ASCII?
Вызов Character.isLetter(c)
возвращается, true
если символ является буквой. Но есть ли способ быстро определить, String
содержит ли a только базовые символы ASCII?
Ответы:
Начиная с Guava 19.0 и далее, вы можете использовать:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
При этом используется matchesAllOf(someString)
метод, основанный на фабричном методе, ascii()
а не на устаревшем ASCII
синглтоне.
Здесь ASCII включает все символы ASCII, включая непечатаемые символы ниже 0x20
(пробела), такие как табуляция, перевод строки / возврат, но также BEL
с кодом 0x07
и DEL
с кодом 0x7F
.
В этом коде неправильно используются символы, а не кодовые точки, даже если кодовые точки указаны в комментариях к более ранним версиям. К счастью, символы, необходимые для создания кодовой точки со значением U+010000
или больше, используют два суррогатных символа со значением вне диапазона ASCII. Таким образом, этот метод по-прежнему успешно тестирует ASCII даже для строк, содержащих эмодзи.
Для более ранних версий Guava без ascii()
метода вы можете написать:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.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
*/
}
}
StandardCharsets.US_ASCII
вместо Charset.forName("US-ASCII")
.
StandardCharsets
? Я мог бы опубликовать другой ответ, но я бы предпочел исправить этот высоко оцененный ответ.
Вот еще один способ, не зависящий от библиотеки, а с использованием регулярного выражения.
Вы можете использовать эту единственную строку:
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"));
}
}
\P{Print}
и \P{Graph}
+ описание? Зачем тебе \A
и \z
?
Выполните итерации по строке и убедитесь, что все символы имеют значение меньше 128.
Строки Java концептуально кодируются как UTF-16. В UTF-16 набор символов ASCII кодируется как значения от 0 до 127, и кодировка любого символа, отличного от ASCII (который может состоять из более чем одного символа Java), гарантированно не включает числа от 0 до 127.
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
поскольку первые 32 значения 7-битной кодировки являются управляющими символами, а конечное значение (0x7F) - DEL
.
Или вы копируете код из 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;
}
return false
вместо isASCII = false
и break
.
commons-lang3 от Apache содержит ценные служебные / удобные методы для всех видов «проблем», включая этот.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
попробуй это:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Выполните итерации по строке и используйте charAt () для получения символа. Затем относитесь к нему как к int и посмотрите, есть ли у него значение Unicode (надмножество ASCII), которое вам нравится.
Перерыв на первое, что вам не нравится.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
возвращает char
. Можете ли вы напрямую проверить, является ли тип char
больше, чем int, сначала без преобразования в int, или ваш тест автоматически выполняет покрытие? Может быть, можно, а может быть? Я пошел вперед и превращал это к междунар так: if ((int)s.charAt(i) > 127)
. Не уверен, что мои результаты отличаются, но я чувствую себя лучше, если позволю ему поработать. Мы увидим: - \
Это было возможно. Довольно проблема.
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;
}
}
Это вернет true, если String содержит только символы ASCII, и false, если это не так.
Charset.forName("US-ASCII").newEncoder().canEncode(str)
Если вы хотите удалить не ASCII, вот фрагмент:
if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
str = str.replaceAll("[^\\p{ASCII}]", "");
}
//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
return (c > 64 && c < 91) || (c > 96 && c < 123);
}