En resumen: strip()
es la evolución «Unicode-aware» de trim()
.
CSR : JDK-8200378
Problema
String::trim ha existido desde los primeros días de Java cuando Unicode no había evolucionado completamente al estándar que usamos ampliamente hoy.
La definición de espacio utilizada por String::trim es cualquier punto de código menor o igual al punto de código de espacio (\u0020), comúnmente conocido como ASCII o caracteres de control ISO.
Las rutinas de recorte compatibles con Unicode deberían utilizar Character::isWhitespace(int).
Además, los desarrolladores no han podido eliminar específicamente el espacio en blanco de la sangría o eliminar específicamente el espacio en blanco de la cola.
Solución
Introducir métodos de recorte que sean conscientes del espacio en blanco de Unicode y que proporcionen un control adicional de sólo el encabezamiento o sólo el final.
Una característica común de estos nuevos métodos es que utilizan una definición diferente (más nueva) de «espacio en blanco» que los métodos antiguos como String.trim()
. Bug JDK-8200373.
El JavaDoc actual para String::trim no deja claro qué definición de «espacio» se está utilizando en el código. Con los métodos de recorte adicionales que vendrán en un futuro próximo y que utilizan una definición diferente de espacio, la aclaración es imperativa. String::trim utiliza la definición de espacio como cualquier punto de código que sea menor o igual que el punto de código del carácter espacio (\u0020.) Los nuevos métodos de recorte utilizarán la definición de espacio (blanco) como cualquier punto de código que devuelva true cuando se pase al predicado Character::isWhitespace.
El método isWhitespace(char)
se añadió a Character
con el JDK 1.1, pero el método isWhitespace(int)
no se introdujo en la clase Character
hasta el JDK 1.5. Este último método (el que acepta un parámetro de tipo int
) se añadió para soportar caracteres suplementarios. Los comentarios de Javadoc para la clase Character
definen los caracteres suplementarios (típicamente modelados con «puntos de código» basados en int) frente a los caracteres BMP (típicamente modelados con un solo carácter):
El conjunto de caracteres de U+0000 a U+FFFF se denomina a veces Plano Multilingüe Básico (BMP). Los caracteres cuyos puntos de código son mayores que U+FFFF se denominan caracteres suplementarios. La plataforma Java utiliza la representación UTF-16 en las matrices de caracteres y en las clases String y StringBuffer. En esta representación, los caracteres suplementarios se representan como un par de valores char … Un valor char, por lo tanto, representa puntos de código del Plano Básico Multilingüe (BMP), incluyendo los puntos de código sustitutos, o unidades de código de la codificación UTF-16. Un valor int representa todos los puntos de código Unicode, incluidos los puntos de código suplementarios. … Los métodos que sólo aceptan un valor char no pueden admitir caracteres suplementarios. … Los métodos que aceptan un valor int admiten todos los caracteres Unicode, incluidos los caracteres suplementarios.
OpenJDK Changeset.
Comparación de pruebas entre trim()
y strip()
– ¿Por qué String.strip() es 5 veces más rápido que String.trim() para una cadena en blanco En Java 11