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

lhcgjxsq  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(180)

每种编程语言都有自己对\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 Character Categories,但没有找到换行符的定义。
我是否必须提出自己的Unicode换行符定义?

hujrc8aj

hujrc8aj1#

在Java、Python、Go和JavaScript等语言之间,关于什么是换行符以及如何将其转换为“新行”,存在着相当大的实际分歧。这种分歧可以通过电池附带的regex引擎如何在多行模式下处理$等模式和\r\r\n\n等字符串来证明:是有两行(\r\r\n\n),三行(\r\r\n\n,就像Unicode说的那样)还是四行(\r\r\n\n,就像JS看到的那样)?Go语言和Python不会把\r\n当作一个$,Rust的正则表达式也不会;我不知道有哪种语言的电池可以将换行符处理扩展到更多的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应被视为两个换行符。您可以阅读整个页面,以了解如何执行您的原始问题。我的猜测是,当您到达“*South East Asian:换行符需要形态分析 *”您将关闭选项卡:-)

zqdjd7g9

zqdjd7g92#

在本文档中,换行符声明为0xA
样品:Rust Playground

// c is our `char`
if c == 0xA as char {
   println!("got a newline character")
}

相关问题