Pourquoi est l'espace insécable pas un caractère d'espacement en java?
Alors que la recherche d'une bonne façon de découper l'espace insécable de analysée HTML, j'ai d'abord tombé sur java spartiate définition de String.trim()
qui est au moins bien documentée. Je voulais éviter explicitement liste de caractères éligibles pour la coupe, j'ai donc supposé que l'utilisation de l'Unicode adossés à des méthodes sur le Caractère de classe pour faire le travail pour moi.
C'est quand j'ai découvert que Caractère.isWhitespace(char) exclut explicitement les espaces insécables:
C'est un espace Unicode caractère (
SPACE_SEPARATOR
,LINE_SEPARATOR
, ouPARAGRAPH_SEPARATOR
) mais n'est pas un espace de non-rupture ('\u00A0'
,'\u2007'
,'\u202F'
).
Pourquoi est-ce?
La mise en œuvre de correspondant .NET équivalent est moins discriminant.
Vous devez vous connecter pour publier un commentaire.
Character.isWhitespace(char)
est vieux. Vraiment vieux. Beaucoup de choses dans les premiers jours de Java, suivies des conventions et la mise en œuvre de C.Maintenant, une décennie plus tard, ces choses semblent erronées. Considérer des éléments de preuve dans quelle mesure les choses ont, même entre les premiers jours de Java et les premiers jours de .NET.
Java s'efforce d'être 100% compatible. Donc, même si l'équipe Java pensé qu'il serait bon de corriger leur erreur initiale et ajouter des espaces insécables à l'ensemble de caractères qui renvoie vrai Caractère.isWhitespace(char), ils ne peuvent pas, parce qu'il est presque certainement existe un logiciel qui s'appuie sur la mise en œuvre actuelle de travail exactement de la façon dont il le fait.
Depuis Java 5, il est aussi un
isSpaceChar(int)
méthode. N'est-ce pas faire ce que vous voulez?trim
type de fonction que utilise cette méthode pour déterminer la bande.isSpaceChar(char)
méthodeComme affiché ci-dessus,
isSpaceChar(int)
fournira l'OP avec une piste de réponse. Il semble assez discrètement documenté, mais cette méthode est en fait utilisable avec les regexes.Donc:
va produire un "X_X_X" de la chaîne. Il est laissé comme exercice pour le lecteur à venir avec les regex pour découper une chaîne de caractères. (Modèle avec quelques drapeaux devrait faire l'affaire.)
Je dirais que Java est mise en œuvre est plus correct que .NET. L'espace insécable est essentiellement un caractère non-blanc qui ressemble à un. C'est, si vous avez les chaînes "foo" et "bar", et de mettre les traditionnels caractère d'espacement entre eux, vous obtiendrez une coupure de mot. Un espace de non-rupture, cependant, ne casse pas les deux.
Le seul moment où un espace insécable doit être traitée d'une manière particulière est avec un code conçu pour effectuer des mot-habillage de texte.
Pour toutes autres fins, y compris le nombre de mots, de parage, et à des fins générales de fractionnement, le long des limites des mots, un espace de non-rupture est encore espaces.
L'argument selon lequel un espace insécable juste "ressemble à" un espace mais n'est-on pas en conflit avec le point de l'ensemble de l'Unicode, ce qui représente des personnages en fonction de leur sens, pas de la façon dont ils sont affichés.
Donc, à mon humble avis, la Java de la mise en œuvre de la Chaîne.trim() ne fonctionne pas comme prévu, et le sous-jacent de Caractère.isWhitespace() la fonction est en faute.
Ma conjecture est que la Java des réalisateurs a écrit isWhitespace() basé sur la nécessité de réaliser l'habillage du texte dans les contrôles. Ils devraient avoir appelé cette fonction isWordWrappingBoundary() ou quelque chose de plus clair, et utilisé un moins restrictif espace de test pour trim().
On dirait le nom de la méthode (
isWhitespace
) est incompatible avec sa fonction (pour détecter les séparateurs). Le "séparateur" la fonctionnalité est assez clair, si vous regardez la liste complète des caractères à partir de la Javadoc de la page que vous avez cité:Un espace de non-rupture de la fonction est censé être visuelle de l'espace entre les mots, qui n'est pas séparé par la césure des algorithmes.
Aussi faire preuve de prudence lors de l'utilisation de l'apache commons fonction StringUtils.isBlank() (et les fonctions connexes) qui a la même étrange isWhitespace comportement, c'est à dire un espace de non-rupture est considérée comme non-vide.