如何在Rust中检查字符是否为Unicode换行符(不仅限于ASCII)?

16
每种编程语言都有自己对\n\r的解释。Unicode支持多个字符来表示换行符。
Rust参考文档中可以得知:
引用:

空白转义是字符U+006E(n)、U+0072(r)或U+0074(t)之一,分别表示Unicode值U+000A(LF)、U+000D(CR)或U+0009(HT)。

根据这个声明,我认为如果一个Rust字符是\n\r,那么它就是一个新行字符。在Windows上,它可能是\r\n的组合。不过我不确定。
那以下字符呢?
  • 下一行字符(U+0085)
  • 行分隔符(U+2028)
  • 段落分隔符(U+2029)
在我看来,我们缺少一个类似于char.is_new_line()的东西。 我查看了Unicode字符类别,但没有找到新行的定义。 我必须自己想出Unicode新行字符的定义吗?
2个回答

22
Java、Python、Go 和 JavaScript 等编程语言之间存在实际差异,不同的是它们认为什么构成换行符,并且如何将其转换为“新行”。这种分歧可通过电池内置正则表达式引擎处理多行模式下类似于 $ 的模式与类似于 \r\r\n\n 的字符串来证明:是否有两行(\r\r\n\n),三行(\r\r\n\n,就像 Unicode 所说的那样)或四行(\r\r\n\n,就像 JS 看到的那样)?Go 和 Python 不会将 \r\n 视为单个 $,Rust 的 regex crate 也不会;Java 则会。我不知道是否有任何一种语言的电池可以扩展到任何更多的 Unicode 字符。
因此,要点如下:
  • 已经商定 \n 是换行符
  • \r\n 可能是单一的换行符
  • 除非 \r\n 被视为两个换行符
  • 除非 \r\n 是“某个字符后面跟着一个换行符”
  • 您不应该再拥有除此之外的任何新行。

如果您真的需要将更多的 Unicode 字符视为换行符,则必须定义一个可以为您执行此操作的函数。不要期望实际输入也期望这样。毕竟,ASCII 记录分隔符已经存在了无数年,每个人都使用 \t 代替。

更新:请参见 http://www.unicode.org/reports/tr14/tr14-32.html#BreakingRules 的第 LB5 节,了解为什么应将 \r\r\n 视为两个换行符。您可以阅读整个页面,以理解如何实现您的原始问题。我猜在看到“东南亚:换行需要形态分析”时,您会关闭标签页 :-)


3
这是一个非常好的调查,我预计会有一定程度的差异,但实际上并没有那么多。既然你提到了Unicode如何看待它,如果你能链接或提及Unicode中定义的内容来支持你的答案,那就太好了。 - Matthieu M.

1

换行符被声明为 0xA,来自这份文档

示例:Rust Playground

// c is our `char`
if c == 0xA as char {
   println!("got a newline character")
}

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