代码之家  ›  专栏  ›  技术社区  ›  Tom Tresansky

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

  •  21
  • Tom Tresansky  · 技术社区  · 8 年前

    在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]
    

    有没有更好的方法来解决这个问题 在字符串声明期间 而不是将我的多行字符串拆分为串联的stringlet,每个stringlet都可以加后缀 char(13) ?

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

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

    或 .replaceAll() 或诸如此类。

    是否存在任何标准方法,或者我应该向字符串添加自己的扩展函数?

    2 回复  |  直到 8 年前
        1
  •  31
  •   Ahamed Mujeeb    6 年前

    这就成功了。

        System.lineSeparator()
    
        2
  •  19
  •   yole    8 年前

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

    对于Kotlin 1.2,没有标准的库方法来实现这一点,因此如果您经常使用它,那么应该定义自己的扩展函数。

    推荐文章