【问题标题】:How do I check if a character is a Unicode new-line character (not only ASCII) in Rust?如何检查字符是否是 Rust 中的 Unicode 换行符(不仅是 ASCII)?
【发布时间】:2017-07-09 11:23:22
【问题描述】:

每种编程语言都有自己对\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 换行符吗?

【问题讨论】:

    标签: unicode rust newline carriage-return linefeed


    【解决方案1】:

    在 Java、Python、Go 和 JavaScript 等语言之间在什么构成换行符以及如何将其转换为“换行符”方面存在相当大的实际分歧。这种分歧通过包含电池的正则表达式引擎如何在多行模式下处理$ 之类的模式与\r\r\n\n 之类的字符串来证明:是否有两行(\r\r\n\n),三行(@ 987654326@、\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 中定义的位置以支持您的答案,那就太好了。
    猜你喜欢
    • 2011-06-26
    • 2015-04-22
    • 2011-04-04
    • 2018-12-25
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2015-03-18
    • 2016-12-21
    相关资源
    最近更新 更多