首页 > 解决方案 > 为什么 Java 不能识别这些空格?

问题描述

空白有25 种类型。Character.isWhitespace(char)在下面的代码中显示了 25 种类型中的四种在 Java 中不被视为空白。为什么 ?

public class Main {
    public static void main(String...args){
        char [] whiteSpaces = {'\u0085', '\u00A0', '\u2007', '\u202F'};
        for(char space : whiteSpaces){
            //All spaces are not white spaces in Java.
            System.out.println("[" + space + "] is a white space in Java:" + Character.isWhitespace(space));
        }
    }
}

参考-https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Character.html#isWhitespace(char)

标签: javacharacter-encoding

解决方案


为什么?因为这就是指定该方法的方式。javadoc forisWhiteSpace列出了它匹配的代码。您确定的 4 不在列表中。

我们不能告诉你为什么它是这样定义的。 但是,javadoc 所说的一个含义是'\u00A0','\u2007'并且'\u202F'被排除在外,因为它们是不间断的空白字符。

'\u0085'或者NEL是一个有趣的案例。根据 Unicode 代码表(请参阅此处获取非官方摘要),它不是一般类别 SPACE_SEPARATOR、LINE_SEPARATOR 或 PARAGRAPH_SEPARATOR 的成员。(它显示在 CONTROL 类别中。)

如果您想要一种能够识别所有 Unicode 空白字符(即 SPACE_SEPARATOR、LINE_SEPARATOR 或 PARAGRAPH_SEPARATOR 中的字符)的方法,您应该使用isSpaceChar( javadoc ) 而不是isWhiteSpace.

请注意,Unicode 规范并不是一成不变的。代码的分类,实际上是“空白”的定义随着时间的推移而演变。每个Java 版本都实现了一个特定版本的 Unicode 规范,该规范在发布时是最新的。例如:

  • Java 8 实现了 Unicode 6.2
  • Java 11 实现了 Unicode 10.0.0
  • Java 13 实现了 Unicode 12.1

Character详细信息在每个 Java 版本的类的 javadoc 中。请注意,给定的 Java 版本未修补以跟踪后续的 Unicode 版本。


底线是“空白”是一个相当模糊的概念。如果你想要一个实现特定含义的方法,你可能需要自己实现它。


推荐阅读