omitir - quitar espacios en blanco java
¿Por qué el espacio non-breaking no es un personaje de espacio en blanco en java? (7)
Mientras buscaba una forma adecuada de recortar el espacio sin interrupciones del HTML analizado, primero tropecé con la espartana definición de String.trim()
de String.trim()
que al menos está documentada correctamente. Quería evitar enumerar explícitamente a los personajes elegibles para recortar, así que asumí que usar métodos respaldados por Unicode en la clase de personaje me haría el trabajo.
Fue entonces cuando descubrí que Character.isWhitespace(char) excluye explícitamente espacios que no se rompen:
Es un carácter de espacio Unicode (
SPACE_SEPARATOR
,LINE_SEPARATOR
, oLINE_SEPARATOR
) pero no es también un espacio sin interrupciones (''/u00A0''
,''/u2007''
,''/u202F''
).
¿Porqué es eso?
La implementación del correspondiente equivalente de .NET es menos discriminatoria.
Como se publicó anteriormente, isSpaceChar(int)
proporcionará al OP una pista para la respuesta. Parece bastante discretamente documentado, pero este método es realmente utilizable con expresiones regulares . Asi que:
"X/u00A0X X".replaceAll("//p{javaSpaceChar}", "_");
producirá una cadena "X_X_X". Se deja como un ejercicio para que el lector proponga la expresión regular para recortar una cuerda. (El patrón con algunas banderas debería ser el truco).
Desde Java 5 también hay un isSpaceChar(int)
. ¿Eso no hace lo que quieres?
Determina si el carácter especificado (punto de código Unicode) es un carácter de espacio Unicode. Se considera que un carácter es un carácter de espacio si y solo si el estándar Unicode lo especifica como un carácter de espacio. Este método devuelve verdadero si el tipo de categoría general del personaje es cualquiera de los siguientes: ...
La única vez que se debe tratar un espacio no disruptivo es especialmente con un código diseñado para realizar el ajuste de palabras del texto.
Para todos los demás fines, incluidos los recuentos de palabras, el recorte y la división de propósito general a lo largo de los límites de las palabras, un espacio sin interrupción sigue siendo un espacio en blanco .
Cualquier argumento de que un espacio sin interrupción simplemente "se parece" a un espacio, pero no es uno, entra en conflicto con el punto total de Unicode, que representa los caracteres en función de su significado, no cómo se muestran.
Por lo tanto, en mi humilde opinión, la implementación de Java de String.trim () no está funcionando como se esperaba, y la función subyacente Character.isWhitespace () tiene la culpa.
Supongo que los implementadores de Java escribieron isWhitespace () en función de la necesidad de realizar el ajuste del texto dentro de los controles. Deberían haber llamado a esta función isWordWrappingBoundary () o algo más claro, y utilizaron una prueba de espacio en blanco menos restrictiva para trim ().
Parece que el nombre del método ( isWhitespace
) no es coherente con su función (para detectar separadores). La funcionalidad de "separador" es bastante clara si nos fijamos en la lista completa de caracteres de la página de Javadoc que citó:
* It is a Unicode space character (SPACE_SEPARATOR, LINE_SEPARATOR, or PARAGRAPH_SEPARATOR) but is not also a non-breaking space (''/u00A0'', ''/u2007'', ''/u202F'').
* It is ''/u0009'', HORIZONTAL TABULATION.
* It is ''/u000A'', LINE FEED.
* It is ''/u000B'', VERTICAL TABULATION.
* It is ''/u000C'', FORM FEED.
* It is ''/u000D'', CARRIAGE RETURN.
* It is ''/u001C'', FILE SEPARATOR.
* It is ''/u001D'', GROUP SEPARATOR.
* It is ''/u001E'', RECORD SEPARATOR.
* It is ''/u001F'', UNIT SEPARATOR.
Se supone que una función de espacio no disruptivo es espacio visual entre palabras que no está separado por algoritmos de separación por sílabas.
También tenga cuidado al usar la función commons de apache StringUtils.isBlank() (y funciones relacionadas) que tiene el mismo comportamiento extraño de isWhitespace , es decir, un espacio non-breaking se considera no en blanco.
Yo diría que la implementación de Java es más correcta que la de .NET. El espacio sin interrupción es esencialmente un personaje que no es de espacio en blanco que se parece a uno. Es decir, si tiene las cadenas "foo" y "bar", y coloca cualquier carácter de espacio en blanco tradicional entre ellas, obtendría un salto de palabra. Un espacio sin interrupciones, sin embargo, no rompe las dos.
Character.isWhitespace(char)
es viejo. Realmente viejo. Muchas cosas hechas en los primeros días de Java siguieron las convenciones e implementaciones de C.
Ahora, más de una década después, estas cosas parecen erróneas. Considérelo como evidencia de lo lejos que han llegado las cosas, incluso entre los primeros días de Java y los primeros días de .NET.
Java se esfuerza por ser 100% compatible con versiones anteriores. Así que incluso si el equipo de Java pensó que sería bueno corregir su error inicial y agregar espacios sin interrupciones al conjunto de caracteres que devuelve verdadero de Character.isWhitespace (char), no pueden, porque es casi seguro que exista software que se basa en la implementación actual trabajando exactamente como lo hace.