为什么在 Java 中,不换行空格不是空格字符?

2022-09-01 08:19:31

在寻找一种从解析的HTML中修剪不间断空间的正确方法时,我首先偶然发现了Java的斯巴达式定义,它至少被正确记录下来了。我想避免显式列出符合修剪条件的字符,因此我认为在 Character 类上使用 Unicode 支持的方法可以完成这项工作。String.trim()

就在那时,我发现 Character.isWhitespace(char) 明确排除了不间断空格:

它是 Unicode 空格字符 (, , or ),但也不是不间断空格 (, , )。SPACE_SEPARATORLINE_SEPARATORPARAGRAPH_SEPARATOR'\u00A0''\u2007''\u202F'

为什么?

相应的 .NET 等效项的实现的歧视性较小。


答案 1

Character.isWhitespace(char)很旧。真的很旧。Java早期的许多事情都遵循C的约定和实现。

现在,十多年后,这些事情似乎是错误的。把它看作是事情已经走了多远的证据,即使在Java的头几天和.NET的头几天之间也是如此。

Java力求100%向后兼容。因此,即使Java团队认为修复他们最初的错误并将不间断空格添加到从Charact.isWhitespace(char)返回true的字符集中是件好事,他们也不能,因为几乎可以肯定的是,存在依赖于当前实现的软件完全按照它的方式工作。


答案 2

从Java 5开始,还有一个isSpaceChar(int)方法。这难道不是你想要的吗?

确定指定的字符(Unicode 码位)是否为 Unicode 空格字符。当且仅当 Unicode 标准指定为空格字符时,才将其视为空格字符。如果字符的常规类别类型为以下任一类型,则此方法返回 true:...


推荐