为什么Java不能识别这些空白?
有<下面代码中的code>Character.isWhitespace(char)显示25种类型中有四种在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
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
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
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单元分离器
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单元分离器
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空白字符当且仅当