Kurz gesagt: strip()
ist eine „Unicode-fähige“ Weiterentwicklung von trim()
.
CSR : JDK-8200378
Problem
String::trim gibt es schon seit den frühen Tagen von Java, als sich Unicode noch nicht vollständig zu dem Standard entwickelt hatte, den wir heute weitgehend verwenden.
Die Definition von Leerzeichen, die von String::trim verwendet wird, ist jeder Codepunkt, der kleiner oder gleich dem Leerzeichen-Codepunkt (\u0020) ist, der allgemein als ASCII- oder ISO-Steuerzeichen bezeichnet wird.
Unicode-fähige Trimm-Routinen sollten Character::isWhitespace(int) verwenden.
Außerdem waren Entwickler nicht in der Lage, speziell Leerzeichen am Einzug oder am Ende zu entfernen.
Lösung
Einführen von Trimm-Methoden, die Unicode-Weißraum berücksichtigen und zusätzliche Kontrolle über nur führenden oder nur nachlaufenden Weißraum bieten.
Ein gemeinsames Merkmal dieser neuen Methoden ist, dass sie eine andere (neuere) Definition von „Weißraum“ verwenden als alte Methoden wie String.trim()
. Bug JDK-8200373.
Aus der aktuellen JavaDoc für String::trim geht nicht klar hervor, welche Definition von „Leerzeichen“ im Code verwendet wird. Da in naher Zukunft weitere Trimm-Methoden kommen werden, die eine andere Definition von „space“ verwenden, ist eine Klärung zwingend erforderlich. String::trim verwendet die Definition von Leerzeichen als jeden Codepunkt, der kleiner oder gleich dem Codepunkt für Leerzeichen ist (\u0020). Neuere Trimm-Methoden werden die Definition von (weißem) Leerzeichen als jeden Codepunkt verwenden, der true zurückgibt, wenn er an das Prädikat Character::isWhitespace übergeben wird.
Die Methode isWhitespace(char)
wurde mit JDK 1.1 zu Character
hinzugefügt, aber die Methode isWhitespace(int)
wurde erst mit JDK 1.5 in die Klasse Character
eingeführt. Die letztgenannte Methode (diejenige, die einen Parameter vom Typ int
akzeptiert) wurde hinzugefügt, um zusätzliche Zeichen zu unterstützen. Die Javadoc-Kommentare für die Klasse Character
definieren ergänzende Zeichen (typischerweise mit int-basierten „Codepunkten“ modelliert) im Gegensatz zu BMP-Zeichen (typischerweise mit einem einzelnen Zeichen modelliert):
Die Menge der Zeichen 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 und in den Klassen String und StringBuffer. In dieser Darstellung werden zusätzliche Zeichen als ein Paar von char-Werten dargestellt … Ein char-Wert repräsentiert daher Basic Multilingual Plane (BMP)-Codepunkte, einschließlich der Surrogat-Codepunkte oder Codeeinheiten der UTF-16-Kodierung. Ein int-Wert steht für alle Unicode-Codepunkte, einschließlich der zusätzlichen Codepunkte. … Die Methoden, die nur einen char-Wert akzeptieren, können keine zusätzlichen Zeichen unterstützen. … Die Methoden, die einen int-Wert akzeptieren, unterstützen alle Unicode-Zeichen, einschließlich ergänzender Zeichen.
OpenJDK Changeset.
Benchmark-Vergleich zwischen trim()
und strip()
– Warum ist String.strip() 5 mal schneller als String.trim() für leere Strings in Java 11