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?
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.