web-dev-qa-db-fra.com

Kotlin ajoute un retour chariot dans une chaîne multiligne

Dans Kotlin, lorsque je crée une chaîne multiligne comme celle-ci:

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

Je vois que la chaîne manque de caractères de retour chariot (code ASCII 13) lorsque je la renvoie via:

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

Production:

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]

Quand du code que j'essaie de tester unitaire construit la même chaîne via un PrintWriter il délimite les lignes via la propriété lineSeparator:

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

Je me retrouve donc avec une chaîne qui ressemble la même en sortie, mais est composée d'octets différents et n'est donc pas égale:

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]

Existe-t-il un meilleur moyen de résoudre ce problème lors de la déclaration de chaîne que de diviser ma chaîne multiligne en stringlets concaténés qui peuvent chacun être suffixés avec char(13)?

Alternativement, je voudrais faire quelque chose comme:

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

ou .replaceAll() ou similaire.

Existe-t-il une méthode standard ou dois-je ajouter ma propre fonction d'extension à String?

7
Tom Tresansky

Les chaînes multilignes Kotlin sont toujours compilées en littéraux de chaîne qui utilisent\n comme séparateur de ligne. Si vous avez besoin du séparateur de ligne dépendant de la plate-forme, vous pouvez faire replace("\n", System.getProperty("line.separator")).

Depuis Kotlin 1.2, il n'y a pas de méthode de bibliothèque standard pour cela, vous devez donc définir votre propre fonction d'extension si vous l'utilisez fréquemment.

7
yole