Der Anruf wird Character.isLetter(c)
zurückgegeben, true
wenn das Zeichen ein Buchstabe ist. Aber gibt es eine Möglichkeit, schnell herauszufinden, ob a String
nur die Basiszeichen von ASCII enthält?
Der Anruf wird Character.isLetter(c)
zurückgegeben, true
wenn das Zeichen ein Buchstabe ist. Aber gibt es eine Möglichkeit, schnell herauszufinden, ob a String
nur die Basiszeichen von ASCII enthält?
Antworten:
Ab Guava 19.0 können Sie Folgendes verwenden:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Hierbei wird die matchesAllOf(someString)
Methode verwendet, die auf der Factory-Methode ascii()
und nicht auf dem jetzt veralteten ASCII
Singleton basiert.
Hier enthält ASCII alle ASCII-Zeichen, einschließlich der nicht druckbaren Zeichen, die kleiner als 0x20
(Leerzeichen) sind, wie Tabulatoren, Zeilenvorschub / Rückgabe, aber auch BEL
mit Code 0x07
und DEL
mit Code 0x7F
.
Dieser Code verwendet fälschlicherweise Zeichen anstelle von Codepunkten, selbst wenn Codepunkte in den Kommentaren früherer Versionen angegeben sind. Glücklicherweise verwenden die Zeichen, die zum Erstellen eines Codepunkts mit einem Wert von U+010000
oder über erforderlich sind, zwei Ersatzzeichen mit einem Wert außerhalb des ASCII-Bereichs. Daher gelingt es der Methode immer noch, auf ASCII zu testen, selbst auf Zeichenfolgen, die Emojis enthalten.
Für frühere Guava-Versionen ohne die ascii()
Methode können Sie schreiben:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
ist jetzt veraltet und wird im Juni 2018 entfernt.
Sie können dies mit java.nio.charset.Charset tun .
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
stattdessen verwenden Charset.forName("US-ASCII")
.
StandardCharsets
? Ich könnte eine andere Antwort posten, aber ich würde diese hoch geschätzte Antwort lieber korrigieren.
Hier ist eine andere Möglichkeit, die nicht von einer Bibliothek abhängt, sondern einen regulären Ausdruck verwendet.
Sie können diese einzelne Zeile verwenden:
text.matches("\\A\\p{ASCII}*\\z")
Ganzes Beispielprogramm:
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}
und \P{Graph}
+ eine Beschreibung hinzufüge ? Warum brauchst du \A
und \z
?
Durchlaufen Sie die Zeichenfolge und stellen Sie sicher, dass alle Zeichen einen Wert von weniger als 128 haben.
Java-Strings werden konzeptionell als UTF-16 codiert. In UTF-16 wird der ASCII-Zeichensatz als die Werte 0 bis 127 codiert, und die Codierung für jedes Nicht-ASCII-Zeichen (das aus mehr als einem Java-Zeichen bestehen kann) enthält garantiert nicht die Zahlen 0 bis 127
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
da die ersten 32 Werte der 7-Bit-Codierung Steuerzeichen sind und der Endwert (0x7F) ist DEL
.
Oder Sie kopieren den Code aus der IDN- Klasse.
// 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
anstatt isASCII = false
und zu verwenden break
.
commons-lang3 von Apache enthält wertvolle Dienstprogramm- / Bequemlichkeitsmethoden für alle Arten von "Problemen", einschließlich dieser.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
Versuche dies:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Durchlaufen Sie die Zeichenfolge und verwenden Sie charAt (), um das Zeichen abzurufen. Behandeln Sie es dann als int und prüfen Sie, ob es einen Unicode-Wert (eine Obermenge von ASCII) hat, den Sie mögen.
Pause beim ersten, den du nicht magst.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
gibt a zurück char
. Können Sie direkt testen, ob ein Typ char
größer als ein int ist, ohne zuerst in ein int zu konvertieren, oder führt Ihr Test die Coversion automatisch durch? Vielleicht kannst du und vielleicht tut es das? Ich ging voran und wandelte dies in ein int wie folgt um : if ((int)s.charAt(i) > 127)
. Ich bin mir nicht sicher, ob meine Ergebnisse anders sind, aber ich fühle mich besser, wenn ich es laufen lasse. Wir werden sehen: - \
Es war möglich. Hübsches 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;
}
}
Dies gibt true zurück, wenn String nur ASCII-Zeichen enthält, und false, wenn dies nicht der Fall ist
Charset.forName("US-ASCII").newEncoder().canEncode(str)
Wenn Sie Nicht-ASCII entfernen möchten, finden Sie hier das Snippet:
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);
}