-4

为什么Character.isSpaceChar('\u0009')在 Java 1.7 中返回 false?此字符也称为 '\t' 或基于字符串的英语:“水平制表符”。根据我的眼睛和维基百科的相似,这个字符空格。但是Java报告错误!

我还尝试在unicode.org上找到一些打印所有字符类别的列表或表格(我的最终目标是找到代码点和类别 Zi、Zp、Zs* 之间的官方映射)无济于事。

*其实现在我又撒谎了。我的最终目标是测试 Java 计算空格的能力并编写我自己的库,一个可以实际使用的库(他还应该删除换行符)。或者我应该把这门科学留给著名的\s模式吗?

4

3 回答 3

8

为什么Character.isSpaceChar('\u0009')在 Java 1.7 中返回 false?

因为isSpaceChar不检查空格字符,所以它检查空格(Unicode 有多个空格字符)。

如果你想检查whitespace,有isWhitespace(它使用空白的Java定义)。

是的,\s确实检查(Java 的定义)空白(不仅仅是空格),特别是[ \t\n\x0B\f\r].

如果你想在你的程序中使用空格的Unicode定义,我不会立即看到一个Character方法或一个预定义的正则表达式类说它这样做。不过,Unicode 联盟提供了很多代码图表,包括这个用于空白的代码图表,所以它应该很容易创建。不要相信我的话(只是快速阅读图表),但例如:

Pattern p = new Pattern("[ \\u0009-\\u000D\\u0085\\u180E\\u2028\\u2029\\u3000\\u1680\\u2000-\\u2006\\u2008-\\u200A\\u205F\\u00A0\\u2007\\u202F]");

...看起来它可能匹配它。或打开这些值的等效功能。

于 2013-04-14T11:50:35.527 回答
4

根据文档,有三类字符被识别为空格:

  • SPACE_SEPARATOR
  • LINE_SEPARATOR
  • PARAGRAPH_SEPARATOR

Tab 不适合这些类别中的任何一个(它是HORIZONTAL TABULATION),因此isSpaceChar正确返回false它。

我的最终目标是测试 Java 计算空格的能力

Character.isWhitespace功能更具包容性 - 特别是它包括HORIZONTAL TABULATION类别。也许这就是您应该使用的功能。

于 2013-04-14T11:51:53.967 回答
0

根据它的Javadoc:

确定指定字符是否为 Unicode 空格字符。当且仅当 Unicode 标准将字符指定为空格字符时,该字符才被视为空格字符。如果角色的一般类别类型是以下任何一种,则此方法返回 true:

SPACE_SEPARATOR LINE_SEPARATOR PARAGRAPH_SEPARATOR

http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isSpaceChar(char)

所以检查Unicode,而不是Java。

于 2013-04-14T11:54:22.263 回答