所有的空白字符?它是否与语言无关?

25

我想知道所有语言是否都将相同的字符视为空格字符,还是存在一些变化。

是否可以提供完整的空白字符列表,区分可以由键盘输入和不同的字符?如果有区别,说明区别及原因更加合适。任何语言都可以,只要不涉及Whitespace或其变体(如果有的话)。当然,我不需要像Whitespace这样的语言的完整列表 :)。


2
嗯,这种编程语言与其他语言的空格字符确实不同。 - Igby Largeman
1
U+1361是“埃塞俄比亚文字间距”,听起来像是一种特定语言的空格字符。 - Jerry Coffin
3个回答

31

一个特定的字符是否被归类为空白字符取决于使用的字符集。尽管如此,编程语言也可以对构成空格的内容进行自定义。

大多数现代语言使用Unicode字符集,其中确实有“空格分隔符字符”的定义。在Zs类别中的任何字符都是“空格分隔符”。

您可以在此处查看完整列表。此外,您可以在官方Unicode字符数据库中搜索;Zs; 以查看那些字符。请注意,随着新的Unicode版本出现,此类别中的字符数量可能会增加,因此我不会说有多少此类字符存在,甚至不会试图列出它们。

除了ZsUnicode 类别之外,Unicode还定义了字符属性。 Unicode定义的属性中包括空格属性。从Unicode 7.0开始,具有此属性的字符包括所有类别为Zs的字符以及一些控制字符(包括U+0009、U+000A、U+000B、U+000C、U+000D和U+0085)。您可以在Unicode.org网站上查找所有具有whitespace属性的字符

现在,许多语言(甚至是现代语言)都有用于正则表达式的特殊符号,例如\s[:space:],但要注意,这些仅指ASCII集中的某些字符;通常限制在

  • SPACE(代码点32,U+0020)
  • TAB (codepoint 9, U+0009)
  • LINE FEED (codepoint 10, U+000A)
  • LINE TABULATION (codepoint 11, U+000B)
  • FORM FEED (codepoint 12, U+000C)
  • CARRIAGE RETURN (codepoint 13, U+000D)
  • 这个列表很有趣,因为它不仅包含空格分隔符(Zs),还包括“控制,其他”类别(Cc)。当编程语言使用术语“空格”时,通常指的就是这些。

    因此,回答你的“完整列表”问题可能最好的方法是说“这要看你的意思是什么”。如果你的意思是“经典空格”,那么可能就是上面列出的六个字符。如果你想要更“现代”的东西,那么它就是这六个字符与Unicode类别Zs中的所有字符的并集。但也许你需要查找其他块中的字符(例如Jerry Coffin在评论中提到的U+1361)。这还取决于你打算如何使用这些空格字符。

    现在最后一件事:Unicode还没有覆盖世界上的每个字符;它还在不断增长。可能将来会添加新的空格字符。目前,类别Zs + 经典字符是你最好的选择。


Ray,你的回答深入浅出,我只是想发表这个评论,以便你能收到我的评论通知,告诉你你缺少3个字符,你可以在我的单独回答中找到。但是因为你的回答深入浅出,我只是想友好地提醒你,让你自行更新你的回答。谢谢!顺便说一句,感谢你提供的优秀信息! - Shawn Kovac
谢谢,@ShawnKovac,已更新。原始答案仅讨论了分类为Zs的17个字符,因此我将其扩展以包括具有“空格字符属性”的字符,这增加了8个(而不仅仅是3个)。你说得对,Unicode 7.0版中有25个具有该属性的字符。 - Ray Toal
但是,当我读到你的答案时,它提供了另外五个不属于Zs清单类别的资源。也许那是你原来回答之后新增的。但是我看到你已经对它进行了改进。雷伊,我很喜欢你提供的这些新资源链接!谢谢你提供这些新的资源! - Shawn Kovac
没问题。正则表达式符号\s确实一直包括了Unicode类别为“其他控制”(Cc)的五个字符U+0009到U+000D。所以发展出来的是将ZsCc分开的不同的Unicode _类别_以及一个Unicode _属性_,将类似空格的控制字符与符号空格统一起来。在我的经验中,类别通常比属性得到更好的支持(例如使用\p{}的正则表达式),但谁知道呢,也许有一天会改变? - Ray Toal
感谢 @RayToal 的更新和更好的解释,比之前已经很好了。现在我更加理解了。感谢你非常丰富的解释。我的意思是,这比我之前想象的要复杂得多! :) - Shawn Kovac

16

当前共有25个Unicode空格字符,其十六进制“编码点”如下:

9, A, B, C, D, 20, 85, A0,
1680, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008, 2009, 200A, 2028, 2029, 202F, 205F,
3000

对应的十进制值为:

9, 10, 11, 12, 13, 32, 133, 160,
5760, 8192, 8193, 8194, 8195, 8196, 8197, 8198,
8199, 8200, 8201, 8202, 8232, 8233, 8239, 8287,
12288

我最初是从Unicode.org获取这些信息的,但我的旧链接现在已经无法使用。如果有人感兴趣的话,维基百科有一个关于空白字符的不错的页面:https://en.wikipedia.org/wiki/Whitespace_character,其中列出了25个字符。(我没有交叉检查这些字符是否与Unicode负责的字符集相同,但我相信Unicode联盟没有对它们的字符集做出如此重大的破坏性更改!)

今天我在unicode的网站上找到了一个简单的页面,但它看起来更像是一个草案html页面,而不是支持或宣称正式立场的任何东西。但它确实与之前Unicode发布的所有空白字符的官方声明相匹配。


133或0x85不是空格,而是<next-line>控制字符。这会引发另一个问题,控制字符并没有控制任何东西,却被呈现为空格。 - Lothar
1
@Lothar:我不同意。官方网站表明它是的。这里有一个例子:https://unicode.org/charts/collation/chart_Whitespace.html - Shawn Kovac
2
我已经交叉验证过,十进制值与维基上的字符相同。还请查看相关的Unicode字符6158、8203、8204、8205、8288、65279 - A1rPun

-6
如果你正在寻找一种高效的方法,我使用以下代码:
(c <= 32 && c >= 0) || c == 127;

0到31是控制字符,32是空格字符,127是ESC字符。这适用于我所知道的所有字符集,包括UTF-8。


6
FYI:这个测试在任何情况下都无法准确工作,即使对于ASCII和UTF-8也是如此。但它确实可以有效地测试最受欢迎的ASCII字符。同时,字符127不是ESC字符,27才是Escape。字符127是Del字符,并且它不是空格字符。相比之下,这确实是一个针对“不可打印”的ASCII字符的准确测试。它们与空格字符有相似之处,但仍然存在差异。用一个松散的类比比较,我会把它们看作是某种程度上相互“堂兄弟”。但是有人可能会要求空格字符,却指的是这些不可打印字符。 - Shawn Kovac
它还测试了32,这是一个可打印的ASCII字符。因此,这不是一个准确的测试。 - Lothar
@Lothar,字符32 空格。那个“可打印”的ASCII字符 空格,所以它 应该 检查字符32。如果不检查32,那就是错误的。 - Shawn Kovac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接