W skrócie: strip()
jest „Unicode-aware” ewolucją trim()
.
CSR : JDK-8200378
Problem
String::trim istnieje od wczesnych dni Javy, kiedy Unicode nie rozwinęło się w pełni do standardu, którego używamy dzisiaj.
Definicja spacji używana przez String::trim to dowolny punkt kodowy mniejszy lub równy punktowi kodowemu spacji (\u0020), powszechnie określany jako ASCII lub znaki kontrolne ISO.
Unicode-aware procedury przycinania powinny używać Character::isWhitespace(int).
Dodatkowo, programiści nie byli w stanie specyficznie usunąć białej przestrzeni wcięcia lub specyficznie usunąć białej przestrzeni spływania.
Rozwiązanie
Wprowadzono metody przycinania, które są świadome białej przestrzeni Unicode i zapewniają dodatkową kontrolę tylko wiodącej lub tylko spacji.
Wspólną cechą tych nowych metod jest to, że używają innej (nowszej) definicji „białej przestrzeni” niż stare metody, takie jak String.trim()
. Bug JDK-8200373.
Obecna JavaDoc dla String::trim nie wyjaśnia, która definicja „spacji” jest używana w kodzie. Z dodatkowymi metodami przycinania nadchodzącymi w najbliższej przyszłości, które używają innej definicji przestrzeni, wyjaśnienie jest konieczne. String::trim używa definicji spacji jako dowolnego punktu kodowego, który jest mniejszy lub równy punktowi kodowemu znaku spacji (\u0020.) Nowsze metody przycinania będą używać definicji (białej) spacji jako dowolnego punktu kodowego, który zwraca wartość true po przekazaniu do predykatu Character::isWhitespace.
Metoda isWhitespace(char)
została dodana do Character
wraz z JDK 1.1, ale metoda isWhitespace(int)
nie została wprowadzona do klasy Character
aż do JDK 1.5. Ta ostatnia metoda (przyjmująca parametr typu int
) została dodana w celu obsługi znaków uzupełniających. Komentarze Javadoc dla klasy Character
definiują znaki uzupełniające (typowo modelowane za pomocą „punktu kodowego” opartego na int) w porównaniu ze znakami BMP (typowo modelowanymi za pomocą pojedynczego znaku):
Zbiór znaków od U+0000 do U+FFFF jest czasami określany jako Podstawowa Płaszczyzna Wielojęzyczna (BMP). Znaki, których punkty kodowe są większe niż U+FFFF, są nazywane znakami uzupełniającymi. Platforma Java używa reprezentacji UTF-16 w tablicach znaków oraz w klasach String i StringBuffer. W tej reprezentacji znaki uzupełniające są reprezentowane jako para wartości znaków … Wartość char reprezentuje zatem punkty kodowe Basic Multilingual Plane (BMP), w tym zastępcze punkty kodowe lub jednostki kodowe kodowania UTF-16. Wartość int reprezentuje wszystkie punkty kodowe Unicode, w tym dodatkowe punkty kodowe. … Metody, które przyjmują tylko wartość char, nie mogą obsługiwać dodatkowych znaków. … Metody, które akceptują wartość int, obsługują wszystkie znaki Unicode, w tym znaki uzupełniające.
OpenJDK Changeset.
Porównanie benchmarków między trim()
i strip()
– Dlaczego String.strip() jest 5 razy szybsze niż String.trim() dla pustego łańcucha W Javie 11
.