Wywołanie Character.isLetter(c)powraca, truejeśli znak jest literą. Ale czy istnieje sposób, aby szybko sprawdzić, czy a Stringzawiera tylko podstawowe znaki ASCII?
Wywołanie Character.isLetter(c)powraca, truejeśli znak jest literą. Ale czy istnieje sposób, aby szybko sprawdzić, czy a Stringzawiera 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 ASCIIsingletonie.
Tutaj ASCII zawiera wszystkie znaki ASCII tym niedrukowalne znaki mniejsze niż 0x20(spacja), takie jak tabulatory, przesunięcie wiersza / powrót, ale także BELkod 0x07i DELkod 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+010000lub 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.ASCIIjest 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_ASCIIzamiast 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 \Ai \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 < 0x7Fponieważ 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 falsezamiast isASCII = falsei 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;
}
charAtzwraca 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);
}