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

How do I check if a character is a Unicode new-line character (not only ASCII) in Rust?

每种编程语言都有自己对 \n\r 的解释。 Unicode 支持多个字符,可以 代表一个新行。

来自the Rust reference

A whitespace escape is one of the characters U+006E (n), U+0072 (r), or U+0074 (t), denoting the Unicode values U+000A (LF), U+000D (CR) or U+0009 (HT) respectively.

根据该声明,如果 Rust 字符是 \n\r,我会说它是换行符。在 Windows 上,它可能是 \r\n 的组合。不过我不确定。

下面的呢?

在我看来,我们缺少像 char.is_new_line() 这样的东西。 我查看了 Unicode Character Categories 但找不到换行符的定义。

我是否必须自己定义什么是 Unicode 换行符?

在 Java、Python、Go 和 JavaScript 等语言之间,关于什么构成换行符以及如何将其转换为 "new lines".包含电池的正则表达式引擎如何在多行模式中针对 \r\r\n\n 这样的字符串处理 $ 这样的模式来证明这种分歧:是否有两行 (\r\r\n, \n),三行(\r\r\n\n,如 Unicode 所说)或四行(\r\r\n\n,像JS看到的一样)? Go 和 Python 不会将 \r\n 视为单个 $,Rust 的正则表达式箱也不会;然而,Java 确实如此。我不知道有哪一种语言的电池可以将换行处理扩展到更多的 Unicode 字符。

所以这里的要点是

  • 约定\n为换行
  • \r\n 可能是单个换行符
  • 除非\r\n被视为两个换行符
  • 除非\r\n是"some character followed by a newline"
  • 除此之外你不能再有换行符了。

如果您确实需要将更多 Unicode 字符视为换行符,则必须定义一个函数来为您执行此操作。不要指望现实世界的输入会如此。毕竟,我们使用 ASCII 记录分隔符已经有无数年了,而且每个人也都使用 \t

更新:请参阅 http://www.unicode.org/reports/tr14/tr14-32.html#BreakingRules 部分 LB5 以了解为什么 \r\r\n 应被视为两个换行符。您可以阅读整个页面以了解必须如何实施您的原始问题。我的猜测是,当您到达“东南亚:换行符需要形态分析”时,您将关闭选项卡:-)