为什么Java Character.isSpaceChar(char)不将水平制表符视为空格?

时间:2013-04-14 11:49:08

标签: java regex tabs whitespace

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

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

*实际上现在我再次撒谎。我的最终目标是测试Java计算空白的能力并编写我自己可以实际计算的库(他还应该删除换行符)。或者我应该将这门科学留给着名的\s模式??

3 个答案:

答案 0 :(得分:8)

  

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

由于isSpaceChar未检查空白字符,it checks for spaces(Unicode有多个空格字符)。

如果要检查空格,则isWhitespace(使用 Java 空白空间定义)。

是的,\s会检查(Java的定义)空白(不仅仅是空格),specifically [ \t\n\x0B\f\r]

如果要在程序中使用空白的 Unicode 定义,我不会立即看到Character方法或预定义正则表达式说它做到这一点的课程。 Unicode联盟提供了大量的code charts,包括空格的this one,因此创建起来应该很简单。不要相信我的话(只是快速阅读图表),但例如:

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

...看起来可能与之匹配。或者是切换这些值的等效函数。

答案 1 :(得分:4)

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

  • SPACE_SEPARATOR
  • LINE_SEPARATOR
  • PARAGRAPH_SEPARATOR

标签不适合任何这些类别(HORIZONTAL TABULATION),因此isSpaceChar会正确返回false

  

我的最终目标是测试Java估算空白的能力

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

答案 2 :(得分: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。