Відповіді:
З 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
тепер застаріло і збирається видалити в червні 2018.
Ви можете зробити це за допомогою 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 (), щоб отримати char. Потім ставитесь до нього як до 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
повертає a 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;
}
}
Це повернеться істинним, якщо 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);
}