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

时间:2017-07-09 11:23:22

标签: unicode rust newline carriage-return linefeed

每种编程语言都有\n\r的解释。 Unicode支持可以代表新行的多个字符。

来自the Rust reference

  

空格转义是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换行符的定义?

1 个答案:

答案 0 :(得分:13)

Java,Python,Go和JavaScript等语言之间存在相当大的实际分歧,即构成换行符的内容以及转换为“新行”的方式。包含电池的正则表达式引擎如何在多行模式下对$这样的字符串处理类似\r\r\n\n的模式,这表明存在分歧:是否有两行(\r\r\n,{{1 }}),三行(\n\r\r\n,如Unicode所示)或四行(\n\r\r\n,就像JS看到的那样)? Go和Python不会将\n视为单个\r\n,Rust的正则表达式也不会;然而,Java确实如此。我不知道任何语言的电池将换行处理扩展到任何更多的Unicode字符。

所以这里的内容是

  • 同意$是换行符
  • \n可能只是一个换行符
  • 除非将\r\n视为两个换行符
  • 除非\r\n是“某个字符后跟换行符”
  • 除此之外你不会再有任何换行符了。

如果您确实需要将更多Unicode字符视为换行符,则必须定义一个为您执行此操作的函数。不要指望期望的真实世界输入。毕竟,我们有数千年的ASCII记录分隔符,而且每个人都使用\r\n

更新:请参阅http://www.unicode.org/reports/tr14/tr14-32.html#BreakingRules部分\t,了解为什么LB5应被视为两个换行符。您可以阅读整页以了解原始问题的实施方式。我的猜测是你到达“东南亚:换行需要形态分析”你将关闭标签: - )