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

Noe*_*mer 9 unicode newline carriage-return linefeed rust

每种编程语言都有自己的解释\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换行符的定义?

use*_*968 13

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如何看待它,那么如果你可以链接或提及在Unicode中定义的位置来备份你的答案就会很棒. (3认同)