如何在 Rust 中检查字符是否为 Unicode 换行符(不仅是 ASCII)?
How do I check if a character is a Unicode new-line character (not only ASCII) in Rust?
每种编程语言都有自己对 \n
和 \r
的解释。
Unicode 支持多个字符,可以 代表一个新行。
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 等语言之间,关于什么构成换行符以及如何将其转换为 "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
应被视为两个换行符。您可以阅读整个页面以了解必须如何实施您的原始问题。我的猜测是,当您到达“东南亚:换行符需要形态分析”时,您将关闭选项卡:-)
每种编程语言都有自己对 \n
和 \r
的解释。
Unicode 支持多个字符,可以 代表一个新行。
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 等语言之间,关于什么构成换行符以及如何将其转换为 "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
应被视为两个换行符。您可以阅读整个页面以了解必须如何实施您的原始问题。我的猜测是,当您到达“东南亚:换行符需要形态分析”时,您将关闭选项卡:-)