Kurzum: strip()
Ist "Unicode-fähige" Evolution von trim()
.
CSR: JDK-8200378
Problem
String :: trim existiert seit den Anfängen von Java, als sich Unicode nicht vollständig zu dem Standard entwickelt hat, den wir heute weit verbreitet haben.
Die von String :: trim verwendete Definition des Leerzeichens ist ein Codepunkt, der kleiner oder gleich dem Leerzeichencodepunkt (\ u0020) ist und üblicherweise als ASCII- oder ISO-Steuerzeichen bezeichnet wird.
Unicode-fähige Trimmroutinen sollten Character :: isWhitespace (int) verwenden.
Darüber hinaus war es Entwicklern nicht möglich, Leerzeichen für Einrückungen oder nachfolgende Leerzeichen speziell zu entfernen.
Lösung
Führen Sie Trimmmethoden ein, die Unicode-Leerzeichen berücksichtigen und eine zusätzliche Kontrolle darüber bieten, ob nur das Führen oder das Nachlaufen erfolgt.
Ein gemeinsames Merkmal dieser neuen Methoden ist, dass sie eine andere (neuere) Definition von "Leerzeichen" verwenden als alte Methoden wie String.trim()
. Bug JDK-8.200.373 .
Das aktuelle JavaDoc für String :: trim macht nicht klar, welche Definition von "Leerzeichen" im Code verwendet wird. In naher Zukunft werden zusätzliche Trimmmethoden eingeführt, die eine andere Definition des Raums verwenden. Eine Klärung ist daher unerlässlich. String :: trim verwendet die Definition von Leerzeichen als Codecode, der kleiner oder gleich dem Codepunkt für Leerzeichen (\ u0020) ist. Neuere Trimmmethoden verwenden die Definition von (Leerzeichen) als Codecode, der bei Übergabe an den Wert true zurückgibt Character :: isWhitespace-Prädikat.
Die Methode isWhitespace(char)
wurde Character
mit JDK 1.1 hinzugefügt , aber die Methode isWhitespace(int)
wurde Character
erst mit JDK 1.5 in die Klasse eingeführt . Die letztere Methode (die einen Parameter vom Typ akzeptiert int
) wurde hinzugefügt, um zusätzliche Zeichen zu unterstützen. Die Javadoc-Kommentare für die Character
Klasse definieren zusätzliche Zeichen (normalerweise mit int-basiertem "Codepunkt" modelliert) im Vergleich zu BMP-Zeichen (normalerweise mit einem einzelnen Zeichen modelliert):
Der Zeichensatz von U + 0000 bis U + FFFF wird manchmal als Basic Multilingual Plane (BMP) bezeichnet. Zeichen, deren Codepunkte größer als U + FFFF sind, werden als Zusatzzeichen bezeichnet. Die Java-Plattform verwendet die UTF-16-Darstellung in char-Arrays sowie in den Klassen String und StringBuffer. In dieser Darstellung werden zusätzliche Zeichen als ein Paar von Zeichenwerten dargestellt ... Ein Zeichenwert repräsentiert daher BMP-Codepunkte (Basic Multilingual Plane), einschließlich der Ersatzcodepunkte oder Codeeinheiten der UTF-16-Codierung. Ein int-Wert repräsentiert alle Unicode-Codepunkte, einschließlich zusätzlicher Codepunkte. ... Die Methoden, die nur einen Zeichenwert akzeptieren, können keine zusätzlichen Zeichen unterstützen. ... Die Methoden, die einen int-Wert akzeptieren, unterstützen alle Unicode-Zeichen, einschließlich zusätzlicher Zeichen.
OpenJDK- Änderungssatz .
Benchmark-Vergleich zwischen trim()
und strip()
- Warum ist String.strip () in Java 11 fünfmal schneller als String.trim () für leere Zeichenfolgen?
Hier ist ein Unit-Test, der die Antwort von @MikhailKholodkov unter Verwendung von Java 11 veranschaulicht.
(Beachten Sie, dass dies
\u2000
oben steht\u0020
und von nicht als Leerzeichen betrachtet wird.trim()
)quelle
Im Allgemeinen werden bei beiden Methoden führende und nachfolgende Leerzeichen aus der Zeichenfolge entfernt. Der Unterschied ergibt sich jedoch, wenn wir mit Unicode-Zeichen oder mehrsprachigen Funktionen arbeiten.
trim () entfernt alle führenden und nachfolgenden Zeichen, deren ASCII-Wert kleiner oder gleich 32 ist ('U + 0020' oder Leerzeichen).
Gemäß Unicode-Standards gibt es verschiedene Leerzeichen mit einem ASCII-Wert von mehr als 32 ('U + 0020'). Beispiel: 8193 (U + 2001).
Um diese Leerzeichen zu identifizieren, wurde die neue Methode isWhitespace (int) aus Java 1.5 in der Zeichenklasse hinzugefügt. Diese Methode verwendet Unicode, um Leerzeichen zu identifizieren. Weitere Informationen zu Unicode-Leerzeichen finden Sie hier .
Der neue Methodenstreifen, der in Java 11 hinzugefügt wird, verwendet diese Character.isWhitespace (int) -Methode, um eine Vielzahl von Leerzeichen abzudecken und zu entfernen.
Beispiel
Ausgabe
Hinweis: Wenn Sie auf einem Windows-Computer ausgeführt werden, können Sie die ähnliche Ausgabe möglicherweise nicht sehen, da der Unicode-Satz begrenzt ist. Sie können einige Online-Compiler ausprobieren, um diesen Code zu testen.
Referenz: Unterschied zwischen Trim- und Strip-Methode Java
quelle