【问题标题】:Why does not Java Character.isSpaceChar(char) reckon horizontal tab as a whitespace? [closed]为什么 Java Character.isSpaceChar(char) 不将水平制表符视为空格? [关闭]
【发布时间】:2013-04-14 11:49:08
【问题描述】:

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

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

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

【问题讨论】:

  • 回答 - 因为这是它指定要做的事情。阅读 javadoc ...提问之前。
  • 告诉所有 stackoverflow 的访问者,看看这个网站之后是否仍然存在 =) 如果你真的想成为一项好运动,请在投票之前尝试阅读我的整个帖子和下面的 cmets。我现在要说的是,我已经完成了阅读文档的工作。
  • 方法名是.isWhiteSpaceChar ...?不,不是,那你有什么问题?
  • 好吧,也许你应该用 Unicode 的明确定义写一个答案,什么是空格和空白字符以及水平制表符在哪里适合。也许这就是我应该从一开始就制定自己的方式避免被所有似乎喜欢在问答网站上闲逛但不希望其他人使用它们的大师抨击。但是,我真的认为一个更简单的问题会像其他任何问题一样“合法”。底线仍然是我没有得到来自isSpaceChar 的输出我认为我应该有。我实在是太抱歉了!!! =)

标签: java regex tabs whitespace


【解决方案1】:

为什么 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 方法或 predefined 正则表达式类说它这样做。不过,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]");

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

【讨论】:

  • 根据这个Wikipedia article,有比[ \t\n\x0B\f\r]更多的字符,即空格。根据我在问题中发布的链接,我们得到了更多与更广泛的术语空白相匹配的字符。所以,我想看看来自 Unicode 的源代码到底是什么空格或空白字符。我什至无法准确了解哪些字符属于 Character.isSpaceChar(char):s API 文档列表类别。
  • @MartinAndersson:是的,但是您没有使用 Wikipedia 文章来告诉您 Java API 函数将做什么。为此,您可以使用 Java API 文档。 :-) 如果您想根据 Unicode 定义知道字符是否为空格,我不会立即看到 Character 方法或预定义的正则表达式类说明它这样做。 Unicode 联盟提供了很多code charts,包括用于空格的this one,所以应该很容易创建。
  • @MartinAndersson:我已将该评论中的信息添加到答案中。
【解决方案2】:

根据documentation,识别为空格的字符分为三类:

  • SPACE_SEPARATOR
  • LINE_SEPARATOR
  • PARAGRAPH_SEPARATOR

标签不适合这些类别中的任何一个(它是HORIZONTAL TABULATION),所以isSpaceChar 正确地返回false

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

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

【讨论】:

  • 你有没有关于为什么水平标签不属于SPACE_SEPARATORLINE_SEPARATORPARAGRAPH_SEPARATOR 的来源(我希望有一些指向 unicode.org 子页面的链接!)?
  • @MartinAndersson Here 是 unicode.org 上的一个表,它列举了所有的 unicode 空间;标签不在其中。
【解决方案3】:

根据它的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。

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 2014-05-30
    • 2013-04-15
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多