Sammanfattningsvis: strip()
är en ”Unicode-medveten” utveckling av trim()
.
CSR : JDK-8200378
Problem
String::trim har funnits sedan Javas tidiga dagar då Unicode inte hade utvecklats fullt ut till den standard som vi använder i stor utsträckning idag.
Definitionen av mellanslag som används av String::trim är alla kodpunkter som är mindre än eller lika med mellanslagskodpunkten (\u0020), vanligen kallade ASCII- eller ISO-kontrolltecken.
Unicode-medvetna trimningsrutiner bör använda Character::isWhitespace(int).
Till detta har utvecklare inte kunnat ta bort specifikt vitrymden vid indragning eller specifikt ta bort vitrymden vid avslut.
Lösning
Introducera trimningsmetoder som är medvetna om Unicode-vitrymden och som ger ytterligare kontroll av endast inledande eller endast avslutande.
Ett gemensamt kännetecken för dessa nya metoder är att de använder en annan (nyare) definition av ”vitrymden” än vad gamla metoder som String.trim()
gjorde. Fel JDK-8200373.
Den nuvarande JavaDoc för String::trim klargör inte vilken definition av ”mellanslag” som används i koden. Med tanke på att det inom en snar framtid kommer ytterligare trimningsmetoder som använder en annan definition av ”space” är det absolut nödvändigt med ett förtydligande. String::trim använder definitionen av mellanslag som en kodpunkt som är mindre än eller lika med kodpunkten för mellanslagstecken (\u0020). Nyare trimningsmetoder kommer att använda definitionen av (vitt) mellanslag som en kodpunkt som returnerar true när den överförs till predikatet Character::isWhitespace.
Metoden isWhitespace(char)
lades till i Character
med JDK 1.1, men metoden isWhitespace(int)
infördes inte i Character
-klassen förrän i JDK 1.5. Den sistnämnda metoden (den som accepterar en parameter av typen int
) lades till för att stödja kompletterande tecken. Javadoc-kommentarerna för klassen Character
definierar tilläggstecken (som vanligtvis modelleras med int-baserade ”kodpunkter”) jämfört med BMP-tecken (som vanligtvis modelleras med ett enda tecken):
Mängden tecken från U+0000 till U+FFFFFF kallas ibland för Basic Multilingual Plane (BMP). Tecken vars kodpunkter är större än U+FFFF kallas tilläggstecken. Java-plattformen använder UTF-16-representationen i char-arrayer och i klasserna String och StringBuffer. I denna representation representeras tilläggstecken som ett par teckenvärden … Ett char-värde representerar därför BMP-kodpunkter (Basic Multilingual Plane), inklusive surrogatkodpunkter, eller kodenheter i UTF-16-kodningen. Ett int-värde representerar alla Unicode-kodpunkter, inklusive tilläggskodpunkter. … De metoder som endast accepterar ett char-värde kan inte stödja tilläggstecken. … Metoderna som accepterar ett int-värde stöder alla Unicode-tecken, inklusive tilläggstecken.
OpenJDK Changeset.
Benchmark jämförelse mellan trim()
och strip()
– Varför är String.strip() 5 gånger snabbare än String.trim() för en tom sträng i Java 11