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?
quelle
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?
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 .
Erkennen Sie Nicht-ASCII-Zeichen in einem String
quelle
StandardCharsets.US_ASCII
stattdessen verwendenCharset.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:
Ganzes Beispielprogramm:
quelle
\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
quelle
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) istDEL
.Oder Sie kopieren den Code aus der IDN- Klasse.
quelle
return false
anstattisASCII = false
und zu verwendenbreak
.commons-lang3 von Apache enthält wertvolle Dienstprogramm- / Bequemlichkeitsmethoden für alle Arten von "Problemen", einschließlich dieser.
quelle
Versuche dies:
quelle
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.
quelle
quelle
charAt
gibt a zurückchar
. Können Sie direkt testen, ob ein Typchar
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.
quelle
Dies gibt true zurück, wenn String nur ASCII-Zeichen enthält, und false, wenn dies nicht der Fall ist
Wenn Sie Nicht-ASCII entfernen möchten, finden Sie hier das Snippet:
quelle
quelle