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?
źródło
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?
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 .
Wykryj znak spoza ASCII w łańcuchu
źródło
StandardCharsets.US_ASCII
zamiastCharset.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:
Cały przykładowy program:
źródło
\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
źródło
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) toDEL
.Lub skopiuj kod z klasy IDN .
źródło
return false
zamiastisASCII = false
ibreak
.commons-lang3 z Apache zawiera cenne narzędzia / metody ułatwiające rozwiązywanie wszelkiego rodzaju „problemów”, w tym tego.
źródło
Spróbuj tego:
źródło
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.
źródło
źródło
charAt
zwraca achar
. 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.
źródło
Spowoduje to zwrócenie wartości true, jeśli String zawiera tylko znaki ASCII i false, gdy nie
Jeśli chcesz usunąć kod spoza ASCII, oto fragment kodu:
źródło
źródło