Scala原始字符串中的Unicode转义错误

6
在Scala字符串中需要直接包含文本:\usepackage{x}。因此,期望的是:
val s = """ ... \usepackage{X} ... """

println(s)
... \usepackage{X} ...

迄今为止的尝试包括:

scala> """\usepackage{X}"""
<console>:1: error: error in unicode escape
       """\usepackage{X}"""
            ^

scala> raw"""\usepackage{X}"""
<console>:1: error: error in unicode escape
       raw"""\usepackage{X}"""
               ^

单引号和双引号都无法成功地表示字符串。

根据http://docs.scala-lang.org/overviews/core/string-interpolation.html,一个可行的示例包括:

scala> raw"a\nb"
res1: String = a\nb

这个不涵盖Unicode的情况。


如果您有答案,请不要编辑原始问题,而是发布一个答案并接受它。 - om-nom-nom
1个回答

10

您似乎面临问题SI-4706:Unicode文字字面量语法阻碍了三引号的常见用例

在Scala中,Unicode转义序列不仅在字符或字符串字面量中被处理。以下代码能够正常工作可能并不明显:

scala> 5 \u002B 10
res0: Int = 15

如果您不想完全禁用Unicode转义符(-Xno-uescape,仅适用于Scala 2.13.1之前版本,请参见 PR#8282 ee8c1ef8 ),那么似乎没有好的方法来解决这个问题。

在SI-4706问题中建议的解决方法之一是分离反斜杠字符:

scala> """\""" + """usepackage{X}"""
res1: String = \usepackage{X}

感谢提供“-Xno-uescape”提示。即使在注释中,\u也会导致编译失败。 - akauppi
1
你也可以对反斜杠和'u'进行Unicode编码:"""\u005c\u0075""" 可以正确地输出\u - ComFreek
@ComFreek 我晚了三年才来参加这个派对,但这值得一个独立的回答。 - Ion Freeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接