fix: decode bonjour escaped utf8

main
Peter Steinberger 2025-12-19 23:21:07 +01:00
parent bc2a66da32
commit 0ac7a93c28
2 changed files with 12 additions and 7 deletions

View File

@ -4,7 +4,7 @@ object BonjourEscapes {
fun decode(input: String): String { fun decode(input: String): String {
if (input.isEmpty()) return input if (input.isEmpty()) return input
val out = StringBuilder(input.length) val bytes = mutableListOf<Byte>()
var i = 0 var i = 0
while (i < input.length) { while (i < input.length) {
if (input[i] == '\\' && i + 3 < input.length) { if (input[i] == '\\' && i + 3 < input.length) {
@ -14,17 +14,22 @@ object BonjourEscapes {
if (d0.isDigit() && d1.isDigit() && d2.isDigit()) { if (d0.isDigit() && d1.isDigit() && d2.isDigit()) {
val value = val value =
((d0.code - '0'.code) * 100) + ((d1.code - '0'.code) * 10) + (d2.code - '0'.code) ((d0.code - '0'.code) * 100) + ((d1.code - '0'.code) * 10) + (d2.code - '0'.code)
if (value in 0..0x10FFFF) { if (value in 0..255) {
out.appendCodePoint(value) bytes.add(value.toByte())
i += 4 i += 4
continue continue
} }
} }
} }
out.append(input[i]) val codePoint = Character.codePointAt(input, i)
i += 1 val charBytes = String(Character.toChars(codePoint)).toByteArray(Charsets.UTF_8)
for (b in charBytes) {
bytes.add(b)
}
i += Character.charCount(codePoint)
} }
return out.toString()
return String(bytes.toByteArray(), Charsets.UTF_8)
} }
} }

View File

@ -14,6 +14,6 @@ class BonjourEscapesTest {
fun decodeDecodesDecimalEscapes() { fun decodeDecodesDecimalEscapes() {
assertEquals("Clawdis Gateway", BonjourEscapes.decode("Clawdis\\032Gateway")) assertEquals("Clawdis Gateway", BonjourEscapes.decode("Clawdis\\032Gateway"))
assertEquals("A B", BonjourEscapes.decode("A\\032B")) assertEquals("A B", BonjourEscapes.decode("A\\032B"))
assertEquals("Peter\u2019s Mac", BonjourEscapes.decode("Peter\\226\\128\\153s Mac"))
} }
} }