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

时间:2018-02-22 17:22:47

标签: kotlin multiline multilinestring

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

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

当我通过以下方式输出字符串时,我看到该字符串缺少回车符(ASCII码13)。

println("Expected bytes")
println(expected.toByteArray().contentToString())

输出:

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]

当我尝试单元测试的某些代码通过PrintWriter构建相同的字符串时,它会通过lineSeparator属性描述行:

/* 
 * Line separator string.  This is the value of the line.separator
 * property at the moment that the stream was created.
 */

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

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]

是否有更好的方法在字符串声明中解决此,而不是将多行字符串拆分为连续的stringlets,每个字符串都可以加char(13)为后缀?

或者,我想做类似的事情:

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

.replaceAll()等。

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

2 个答案:

答案 0 :(得分:4)

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

从Kotlin 1.2开始,没有标准的库方法,所以如果你经常使用它,你应该定义自己的扩展函数。

答案 1 :(得分:1)

这成功了。

    System.lineSeparator()