Kotlin将回车符添加到多行字符串中

Tom*_*sky 7 multiline multilinestring kotlin

在Kotlin中,当我构建这样的多行字符串时:

value expected = """
                |digraph Test {
                |${'\t'}Empty1;
                |${'\t'}Empty2;
                |}
                |""".trimMargin()
Run Code Online (Sandbox Code Playgroud)

通过以下输出时,我发现该字符串缺少回车符(ASCII代码13):

println("Expected bytes")
println(expected.toByteArray().contentToString())
Run Code Online (Sandbox Code Playgroud)

输出:

Expected bytes
[100, 105, 103, 114, 97, 112, 104, 32, 84, 101, 115, 116, 32, 123, 10, 9, 69, 109, 112, 116, 121, 49, 59, 10, 9, 69, 109, 112, 116, 121, 50, 59, 10, 125, 10]
Run Code Online (Sandbox Code Playgroud)

当我尝试进行单元测试的某些代码通过a构建相同的String时,PrintWriter它通过lineSeparator属性来描述行:

/* 
 * Line separator string.  This is the value of the line.separator
 * property at the moment that the stream was created.
 */
Run Code Online (Sandbox Code Playgroud)

因此,我最终得到一个字符串,该字符串在输出中看起来相同,但是由不同的字节组成,因此不相等:

Actual bytes
[100, 105, 103, 114, 97, 112, 104, 32, 84, 101, 115, 116, 32, 123, 13, 10, 9, 69, 109, 112, 116, 121, 49, 59, 13, 10, 9, 69, 109, 112, 116, 121, 50, 59, 13, 10, 125, 13, 10]
Run Code Online (Sandbox Code Playgroud)

是否有比在将多行字符串分割为可附加后缀的串联字符串更好的解决字符串声明的方法char(13)呢?

另外,我想做类似的事情:

value expected = """
                |digraph Test {
                |${'\t'}Empty1;
                |${'\t'}Empty2;
                |}
                |""".trimMargin().useLineSeparator(System.getProperty("line.separator"))
Run Code Online (Sandbox Code Playgroud)

.replaceAll()或此类。

是否存在任何标准方法,还是应该将自己的扩展函数添加到String?

小智 27

这成功了。

    System.lineSeparator()
Run Code Online (Sandbox Code Playgroud)


yol*_*ole 8

Kotlin多行字符串总是被编译成使用\ n作为行分隔符的字符串文字。如果需要具有平台相关的行分隔符,则可以执行replace("\n", System.getProperty("line.separator"))

从Kotlin 1.2开始,没有标准的库方法,因此,如果您经常使用此功能,则应定义自己的扩展函数。