From 33fadcbd0c7076b848bdca4d62a9c684d5781232 Mon Sep 17 00:00:00 2001 From: kitadai31 <90122968+kitadai31@users.noreply.github.com> Date: Sat, 19 Jul 2025 04:31:51 +0900 Subject: [PATCH] fix: Correctly save XML files in UTF-8 by using a bufferedWriter (#356) --- .../app/revanced/patcher/util/Document.kt | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/app/revanced/patcher/util/Document.kt b/src/main/kotlin/app/revanced/patcher/util/Document.kt index 3cc4ade..c768552 100644 --- a/src/main/kotlin/app/revanced/patcher/util/Document.kt +++ b/src/main/kotlin/app/revanced/patcher/util/Document.kt @@ -4,7 +4,6 @@ import org.w3c.dom.Document import java.io.Closeable import java.io.File import java.io.InputStream -import java.io.StringWriter import javax.xml.parsers.DocumentBuilderFactory import javax.xml.transform.OutputKeys import javax.xml.transform.TransformerFactory @@ -36,20 +35,22 @@ class Document internal constructor( readerCount.remove(it) } - it.outputStream().buffered().use { stream -> - val transformer = TransformerFactory.newInstance().newTransformer() - // Set to UTF-16 but encode as UTF-8 to prevent surrogate pairs from being escaped to broken numeric character references. - if (isAndroid) { - transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16") - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes") + val transformer = TransformerFactory.newInstance().newTransformer() + // Set to UTF-16 to prevent surrogate pairs from being escaped to invalid numeric character references, but save as UTF-8. + if (isAndroid) { + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16") + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes") + it.bufferedWriter(charset = Charsets.UTF_8).use { writer -> + transformer.transform(DOMSource(this), StreamResult(writer)) } - transformer.transform(DOMSource(this), StreamResult(stream)) + } else { + transformer.transform(DOMSource(this), StreamResult(it)) } } } private companion object { private val readerCount = mutableMapOf() - private val isAndroid = System.getProperty("java.runtime.name").equals("Android Runtime") + private val isAndroid = System.getProperty("java.runtime.name") == "Android Runtime" } }