【问题标题】:Problems with line separator in Scala StringLikeScala StringLike 中的行分隔符问题
【发布时间】:2015-12-16 19:20:53
【问题描述】:

当获取从浏览器 HTML 复制和粘贴的输入时,我有时会将 Unicode LINE SEPARATOR's 放入我的应用程序中:

\u2028

http://www.fileformat.info/info/unicode/char/2028/index.htm

这里是引号:""

由于原因,我将输入分成几行,但很遗憾StringLike.lines 没有收到这些内容:

https://github.com/scala/scala/blob/2.11.x/src/library/scala/collection/immutable/StringLike.scala#L76

有人知道为什么吗?

【问题讨论】:

  • 可能是一个错误,对于 \u2424 "SYMBOL FOR NEWLINE" 也是如此。你可以试试report it。此外,作为一种解决方法,pimp my library 模式 的良好候选者

标签: scala unicode


【解决方案1】:

您问题中链接的代码行定义了StringLike.lines 用于换行符的标准:

private def isLineBreak(c: Char) = c == LF || c == FF

LLFF 定义为:

private final val LF = 0x0A
private final val FF = 0x0C

Unicode 字符\u2028 与其中任何一个都不相同。在 scala 解释器中,我们可以检查:

scala> val x = "\u2028"

x: String = "
"

scala> val LF = 0x0A
LF: Int = 10

scala> val FF = 0x0C
FF: Int = 12

scala> x == LF || x == FF
res0: Boolean = false

这就是StringLike.lines 不捕获给定Unicode 换行符的原因。

我猜想 Scala 函数以这种方式编写的原因,即为什么它只使用这些 ASCII 换行符(LF 和 FF),是因为不需要对字符串编码做出假设,即 UTF -8 与 ISO-8859-1 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多