每种编程语言对\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/