In het kort: strip()
is een “Unicode-bewuste” evolutie van trim()
.
CSR : JDK-8200378
Probleem
String::trim bestaat al sinds de begindagen van Java, toen Unicode nog niet volledig was geëvolueerd tot de standaard die we tegenwoordig op grote schaal gebruiken.
De door String::trim gebruikte definitie van spatie is elk codepunt kleiner dan of gelijk aan het spatie-codepunt (\u0020), gewoonlijk ASCII- of ISO-controletekens genoemd.
Unicode-bewuste trimroutines moeten Character::isWhitespace(int) gebruiken.
Overigens zijn ontwikkelaars niet in staat geweest om specifiek witruimte bij inspringen of om specifiek witruimte achteraan te verwijderen.
Oplossing
Installeer trimmethoden die Unicode-witruimte kennen en extra controle bieden over alleen voorloop of alleen naloop.
Een gemeenschappelijk kenmerk van deze nieuwe methoden is dat ze een andere (nieuwere) definitie van “witruimte” gebruiken dan de oude methoden, zoals String.trim()
. Bug JDK-8200373.
De huidige JavaDoc voor String::trim maakt niet duidelijk welke definitie van “spatie” wordt gebruikt in de code. Aangezien er in de nabije toekomst nog meer trimmethodes komen die een andere definitie van spatie gebruiken, is verduidelijking noodzakelijk. String::trim gebruikt de definitie van spatie als elk codepunt dat kleiner is dan of gelijk is aan het spatieteken codepunt (\u0020.) Nieuwere trimmethoden zullen de definitie van (witte) spatie gebruiken als elk codepunt dat waar retourneert wanneer het wordt doorgegeven aan het Character::isWhitespace predicaat.
De methode isWhitespace(char)
werd met JDK 1.1 aan Character
toegevoegd, maar de methode isWhitespace(int)
werd pas met JDK 1.5 aan de klasse Character
toegevoegd. De laatste methode (degene die een parameter van het type int
accepteert) werd toegevoegd om aanvullende tekens te ondersteunen. De Javadoc opmerkingen voor de Character
klasse definiëren aanvullende karakters (meestal gemodelleerd met int-gebaseerde “code point”) versus BMP karakters (meestal gemodelleerd met enkel karakter):
De set van karakters van U+0000 tot U+FFFF wordt soms aangeduid als de Basic Multilingual Plane (BMP). Tekens waarvan de codepunten groter zijn dan U+FFFF worden aanvullende tekens genoemd. Het Java-platform gebruikt de UTF-16 representatie in char arrays en in de klassen String en StringBuffer. In deze weergave worden aanvullende tekens weergegeven als een paar char-waarden … Een char-waarde vertegenwoordigt dus BMP-codepunten (Basic Multilingual Plane), inclusief de surrogaat-codepunten, of code-eenheden van de UTF-16-codering. Een int-waarde vertegenwoordigt alle Unicode-codepunten, inclusief aanvullende codepunten. … De methoden die alleen een char-waarde accepteren, kunnen geen aanvullende tekens ondersteunen. … De methoden die een int waarde accepteren ondersteunen alle Unicode karakters, inclusief aanvullende karakters.
OpenJDK Changeset.
Benchmark vergelijking tussen trim()
en strip()
– Waarom is String.strip() 5 keer sneller dan String.trim() voor lege string In Java 11