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

标签 unicode rust newline carriage-return linefeed

每种编程语言对\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 的组合。不过我不确定。

接下来呢?

  • 下一行字符 (U+0085)
  • 行分隔符(U+2028)
  • 段落分隔符(U+2029)

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

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

最佳答案

在 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 的正则表达式箱也不会;然而,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 应被视为两个换行符。您可以阅读整个页面以了解必须如何实现您的原始问题。我的猜测是,当您到达“东南亚:换行符需要形态分析”时,您将关闭选项卡 :-)

关于unicode - 如何在 Rust 中检查字符是否为 Unicode 换行符(不仅是 ASCII)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44995851/

相关文章:

java - 在我的代码确认我删除了所有新行后,为什么我的输出仍然显示新行?

C 相当于 c++ cin.peek()

Emojis的Python3 src编码

java - 将 unicode 字符传递给 Jython

rust - 如何从单行标准输入中读取多个整数?

algorithm - 我无法理解 Rust 代码的区别

java - Itext PDF writer,有什么方法可以在pdf中允许unicode下标符号吗? (没有 setTextRise)

python - 我如何更好地处理涉及Unicode字符以及从ASCII来回往返的编码和解码

rust - 为什么 Rust 的临时值有时是可引用的,有时却不是?

java - 字符串数组和 BufferedReader