Wywołanie Character.isLetter(c)
powraca, true
jeśli znak jest literą. Ale czy istnieje sposób, aby szybko sprawdzić, czy a String
zawiera tylko podstawowe znaki ASCII?
Wywołanie Character.isLetter(c)
powraca, true
jeśli znak jest literą. Ale czy istnieje sposób, aby szybko sprawdzić, czy a String
zawiera tylko podstawowe znaki ASCII?
Odpowiedzi:
Począwszy od Guava 19.0 możesz używać:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Używa matchesAllOf(someString)
metody, która opiera się na metodzie fabrycznej, ascii()
a nie na obecnie przestarzałym ASCII
singletonie.
Tutaj ASCII zawiera wszystkie znaki ASCII tym niedrukowalne znaki mniejsze niż 0x20
(spacja), takie jak tabulatory, przesunięcie wiersza / powrót, ale także BEL
kod 0x07
i DEL
kod 0x7F
.
Ten kod niepoprawnie używa znaków zamiast punktów kodowych, nawet jeśli punkty kodowe są wskazane w komentarzach do wcześniejszych wersji. Na szczęście znaki wymagane do utworzenia punktu kodowego o wartości równej U+010000
lub większej używają dwóch zastępczych znaków o wartości spoza zakresu ASCII. Tak więc metoda nadal sprawdza się w testowaniu pod kątem ASCII, nawet dla ciągów zawierających emoji.
W przypadku wcześniejszych wersji Guava bez ascii()
metody możesz napisać:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
jest obecnie przestarzały i wkrótce zostanie usunięty w czerwcu 2018 r.
Możesz to zrobić za pomocą 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
zamiast Charset.forName("US-ASCII")
.
StandardCharsets
? Mógłbym opublikować inną odpowiedź, ale wolę naprawić tę bardzo cenioną odpowiedź.
Oto inny sposób, który nie zależy od biblioteki, ale używa wyrażenia regularnego.
Możesz użyć tej pojedynczej linii:
text.matches("\\A\\p{ASCII}*\\z")
Cały przykładowy program:
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}
i \P{Graph}
+ opis? Dlaczego potrzebujesz \A
i \z
?
Przejdź przez ciąg i upewnij się, że wszystkie znaki mają wartość mniejszą niż 128.
Ciągi Java są kodowane koncepcyjnie jako UTF-16. W UTF-16 zestaw znaków ASCII jest kodowany jako wartości 0–127, a kodowanie dowolnego znaku innego niż ASCII (który może składać się z więcej niż jednego znaku Java) gwarantuje, że nie będzie zawierał liczb 0–127
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
ponieważ pierwsze 32 wartości 7-bitowego kodowania to znaki kontrolne, a końcowa wartość (0x7F) to DEL
.
Lub skopiuj kod z klasy 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
zamiast isASCII = false
i break
.
commons-lang3 z Apache zawiera cenne narzędzia / metody ułatwiające rozwiązywanie wszelkiego rodzaju „problemów”, w tym tego.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
Spróbuj tego:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Przejdź przez ciąg i użyj funkcji charAt (), aby uzyskać znak char. Następnie potraktuj go jako int i zobacz, czy ma wartość Unicode (nadzbiór ASCII), którą lubisz.
Złam się w pierwszej kolejności, której nie lubisz.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
zwraca a char
. Czy możesz bezpośrednio sprawdzić, czy typchar
jest większy niż int bez wcześniejszej konwersji na int, czy też twój test automatycznie wykonuje konwersję? Może możesz, a może tak? I poszedł do przodu i konwertowane do int to tak: if ((int)s.charAt(i) > 127)
. Nie jestem pewien, czy moje wyniki są inne, ale czuję się lepiej, pozwalając temu działać. Zobaczymy: - \
To było możliwe. Niezły problem.
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;
}
}
Spowoduje to zwrócenie wartości true, jeśli String zawiera tylko znaki ASCII i false, gdy nie
Charset.forName("US-ASCII").newEncoder().canEncode(str)
Jeśli chcesz usunąć kod spoza ASCII, oto fragment kodu:
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);
}