Kısacası: strip()
"Unicode farkında" bir evrimdir trim()
.
CSR: JDK-8200378
Sorun
String :: trim, Unicode'un bugün yaygın olarak kullandığımız standarda tam olarak gelişmediği Java'nın ilk günlerinden beri var olmuştur.
String :: trim tarafından kullanılan boşluğun tanımı, genellikle ASCII veya ISO kontrol karakterleri olarak adlandırılan, alan kodu noktasına (\ u0020) eşit veya ondan küçük herhangi bir kod noktasıdır.
Unicode duyarlı kırpma rutinleri Character :: isWhitespace (int) kullanmalıdır.
Ek olarak, geliştiriciler girintili beyaz boşluğu özel olarak kaldıramadılar veya özellikle sondaki beyaz boşluğu kaldıramadılar.
Çözüm
Unicode beyaz boşluk farkında olan ve yalnızca satır aralığı veya yalnızca sonda ek denetim sağlayan kırpma yöntemlerini tanıtın.
Bu yeni yöntemlerin ortak bir özelliği, gibi eski yöntemlerden farklı (daha yeni) bir "boşluk" tanımı kullanmalarıdır String.trim()
. Hata JDK-8200373 .
String :: trim için mevcut JavaDoc, kodda hangi "boşluk" tanımının kullanıldığını netleştirmez. Yakın gelecekte farklı bir alan tanımı kullanan ek kırpma yöntemleri ile, açıklık getirmek zorunludur. String :: trim, boşluk karakter kod noktasından (\ u0020) küçük veya ona eşit olan herhangi bir kod noktası olarak boşluk tanımını kullanır. Daha yeni kırpma yöntemleri, (beyaz) boşluk tanımını, Character :: isWhitespace yüklemi.
Yönteme JDK 1.1 ile isWhitespace(char)
eklendi Character
, ancak yöntem JDK 1.5'e kadar sınıfa isWhitespace(int)
tanıtılmadı Character
. İkinci yöntem (bir tür parametresini kabul eden int
) ek karakterleri desteklemek için eklenmiştir. Character
Sınıf için Javadoc yorumları, tamamlayıcı karakterleri (tipik olarak int tabanlı "kod noktası" ile modellenmiş) ve BMP karakterlerini (genellikle tek karakterle modellenmiş) tanımlar:
U + 0000 ile U + FFFF arasındaki karakter kümesine bazen Temel Çok Dilli Düzlem (BMP) adı verilir. Kod noktaları U + FFFF'den büyük olan karakterlere tamamlayıcı karakterler denir. Java platformu, char dizilerinde ve String ve StringBuffer sınıflarında UTF-16 temsilini kullanır. Bu gösterimde, tamamlayıcı karakterler bir çift karakter değeri olarak temsil edilir ... Bu nedenle, bir char değeri, yedek kod noktaları veya UTF-16 kodlamasının kod birimleri dahil olmak üzere Temel Çok Dilli Düzlem (BMP) kod noktalarını temsil eder. Bir int değeri, tamamlayıcı kod noktaları dahil tüm Unicode kod noktalarını temsil eder. ... Yalnızca bir char değerini kabul eden yöntemler, ek karakterleri destekleyemez. ... int değerini kabul eden yöntemler, tamamlayıcı karakterler dahil tüm Unicode karakterlerini destekler.
OpenJDK Değişiklik Kümesi .
Benchmark karşılaştırma arasındaki trim()
ve strip()
- Neden 5 kat daha hızlı String.trim () den boş dize için Java 11 yılında String.strip () 'dir