为什么Java不能识别这些空白?

为什么Java不能识别这些空白?,java,character-encoding,Java,Character Encoding,有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

有<下面代码中的code>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)

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

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

'\u0085'
NEL
是一个有趣的例子。根据Unicode代码表(参见非官方摘要),它不是一般类别空格分隔符、行分隔符或段落分隔符的成员。(它显示在控制类别中。)

如果需要识别所有Unicode空白字符(即空格分隔符、行分隔符或段落分隔符中的字符)的方法,则应使用
isSpaceChar
()而不是
isWhiteSpace

请注意,Unicode规范不是一个不变的东西。代码的分类以及“空白”的定义随着时间的推移而不断演变。每一个在发布时都是最新的。例如:

  • Java8实现Unicode 6.2
  • Java11实现了Unicode 10.0.0
  • Java13实现了Unicode 12.1
每个Java版本的
Character
类的详细信息都在javadoc中。请注意,给定的Java版本并没有经过修补以跟踪后续的Unicode版本



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

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

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

'\u0085'
NEL
是一个有趣的例子。根据Unicode代码表(参见非官方摘要),它不是一般类别空格分隔符、行分隔符或段落分隔符的成员。(它显示在控制类别中。)

如果需要识别所有Unicode空白字符(即空格分隔符、行分隔符或段落分隔符中的字符)的方法,则应使用
isSpaceChar
()而不是
isWhiteSpace

请注意,Unicode规范不是一个不变的东西。代码的分类以及“空白”的定义随着时间的推移而不断演变。每一个在发布时都是最新的。例如:

  • Java8实现Unicode 6.2
  • Java11实现了Unicode 10.0.0
  • Java13实现了Unicode 12.1
每个Java版本的
Character
类的详细信息都在javadoc中。请注意,给定的Java版本并没有经过修补以跟踪后续的Unicode版本



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

Java似乎没有在任何地方公开unicode空白列表

在Java中,isWhitespace被专门定义为以下内容之一:

  • 它是一个Unicode空格字符(空格分隔符、行分隔符或段落分隔符),但也不是一个不间断空格('\u00A0'、'\u2007'、'\u202F')
  • 它是'\t',U+0009水平制表法
  • 它是'\n',U+000A换行符
  • 它是'\u000B',U+000B垂直制表
  • 它是'\f',U+000C表单馈送
  • 它是'\r',U+000D回车
  • 它是'\u001C',U+001C文件分隔符
  • 它是'\u001D',U+001D组分隔符
  • 它是'\u001E',U+001E记录分隔符
  • 它是'\u001F',U+001F单元分离器
Java还通过
Character.isSpaceChar()
提供unicode空格,但不提供unicode空格。这是一个稍微不同的列表

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) + " Unicode: " + Character.isSpaceChar(space));
        }
输出:

[] is a white space in Java: false Unicode: false
[ ] is a white space in Java: false Unicode: true
[ ] is a white space in Java: false Unicode: true
[ ] is a white space in Java: false Unicode: true

如果您的应用程序需要匹配unicode规范而不是java规范,只需自己定义即可。

java似乎不会在任何地方公开unicode空白列表

在Java中,isWhitespace被专门定义为以下内容之一:

  • 它是一个Unicode空格字符(空格分隔符、行分隔符或段落分隔符),但也不是一个不间断空格('\u00A0'、'\u2007'、'\u202F')
  • 它是'\t',U+0009水平制表法
  • 它是'\n',U+000A换行符
  • 它是'\u000B',U+000B垂直制表
  • 它是'\f',U+000C表单馈送
  • 它是'\r',U+000D回车
  • 它是'\u001C',U+001C文件分隔符
  • 它是'\u001D',U+001D组分隔符
  • 它是'\u001E',U+001E记录分隔符
  • 它是'\u001F',U+001F单元分离器
Java还通过
Character.isSpaceChar()
提供unicode空格,但不提供unicode空格。这是一个稍微不同的列表

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) + " Unicode: " + Character.isSpaceChar(space));
        }
输出:

[] is a white space in Java: false Unicode: false
[ ] is a white space in Java: false Unicode: true
[ ] is a white space in Java: false Unicode: true
[ ] is a white space in Java: false Unicode: true

如果您的应用程序需要匹配unicode规范而不是java规范,只需自己定义即可。

如果您阅读文档,即的javadoc,它会说:

根据Java确定指定的字符是否为空白。字符是Java空白字符当且仅当