Röviden: strip()
a trim()
“Unicode-tudatos” evolúciója.
CSR : JDK-8200378
Problem
A String::trim már a Java korai napjaitól létezik, amikor a Unicode még nem fejlődött teljesen a ma széles körben használt szabványra.
A String::trim által használt szóköz definíciója minden olyan kódpont, amely kisebb vagy egyenlő a szóköz kódponttal (\u0020), amelyet általában ASCII vagy ISO vezérlő karaktereknek neveznek.
Az Unicode-tudatos trimmelési rutinoknak a Character::isWhitespace(int)-t kell használniuk.
A fejlesztők emellett nem voltak képesek kifejezetten eltávolítani a behúzási fehérteret vagy kifejezetten az utána lévő fehérteret.
megoldás
Bevezetni olyan trimmelési módszereket, amelyek ismerik a Unicode fehérteret, és további vezérlést biztosítanak arra, hogy csak az élen vagy csak a végén álljanak.
Az új módszerek közös jellemzője, hogy a “fehérteret” más (újabb) definíciót használnak, mint a régi módszerek, például a String.trim()
. Bug JDK-8200373.
A String::trim jelenlegi JavaDoc-ja nem teszi egyértelművé, hogy a kódban a “szóköz” melyik definícióját használják. Mivel a közeljövőben további trimmelési módszerek jönnek, amelyek a szóköz más definícióját használják, a tisztázás elengedhetetlen. A String::trim a szóköz definícióját olyan kódpontként használja, amely kisebb vagy egyenlő a szóköz karakter kódpontjával (\u0020). Az újabb trimmelési módszerek a (fehér) szóköz definícióját olyan kódpontként fogják használni, amely a Character::isWhitespace predikátumnak átadva igazat ad vissza.
A isWhitespace(char)
metódus a JDK 1.1-gyel került hozzá a Character
osztályhoz, de a isWhitespace(int)
metódus csak a JDK 1.5-ben került be a Character
osztályba. Ez utóbbi (a int
típusú paramétert elfogadó) metódus a kiegészítő karakterek támogatása érdekében került hozzá. A Character
osztály Javadoc-kommentárjai definiálják a kiegészítő karaktereket (jellemzően int-alapú “kódponttal” modellezve) a BMP karakterekkel szemben (jellemzően egyetlen karakterrel modellezve):
Az U+0000 és U+FFFF közötti karakterek halmazát néha többnyelvű alapsíknak (BMP) nevezik. Azokat a karaktereket, amelyek kódpontjai az U+FFFF-nél nagyobbak, kiegészítő karaktereknek nevezzük. A Java platform az UTF-16 ábrázolást használja a char tömbökben, valamint a String és StringBuffer osztályokban. Ebben a reprezentációban a kiegészítő karakterek char értékek párjaként jelennek meg … Egy char-érték tehát a Basic Multilingual Plane (BMP) kódpontokat reprezentálja, beleértve az UTF-16 kódolás helyettesítő kódpontjait vagy kódegységeit is. Egy int érték az összes Unicode kódpontot képviseli, beleértve a kiegészítő kódpontokat is. … Azok a módszerek, amelyek csak char értéket fogadnak el, nem támogatják a kiegészítő karaktereket. … Az int értéket elfogadó metódusok támogatják az összes Unicode karaktert, beleértve a kiegészítő karaktereket is.
OpenJDK Changeset.
Benchmark összehasonlítás trim()
és strip()
között – Miért 5-ször gyorsabb a String.strip(), mint a String.trim() üres karakterlánc esetén In Java 11
.