You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中保存XML时如何让西里尔符号以UTF-8形式正常显示?

Android保存XML时保留西里尔字符(避免实体编码)的解决方案

问题根源在两个环节:Xml.newSerializer默认会将非ASCII字符转成HTML实体编码,且保存时未明确指定UTF-8编码写入。以下是修复方案:

1. 修改XML序列化配置,禁用实体转义

生成XML字符串时,给序列化器指定UTF-8编码,并关闭字符转义功能,让西里尔字符直接输出原字符:

val xmlSerializer = Xml.newSerializer().apply {
    setOutput(StringWriter())
    // 指定XML文档的编码声明
    setEncoding("UTF-8")
    // 禁用实体转义,保留西里尔原字符
    setFeature("http://xmlpull.org/v1/doc/features.html#escape-characters", false)
    
    // 构建XML文档示例
    startDocument("UTF-8", true)
    startTag(null, "root")
    startTag(null, "content")
    // 直接写入西里尔字符
    text("Привет, мир!")
    endTag(null, "content")
    endTag(null, "root")
    endDocument()
}
val xmlString = xmlSerializer.output.toString()

2. 保存时明确指定UTF-8编码写入

使用OutputStreamWriter指定UTF-8编码,确保字节流写入时使用正确的字符集,避免系统默认编码干扰:

context.contentResolver.openOutputStream(source, "w")?.let { outputStream ->
    OutputStreamWriter(outputStream, Charsets.UTF_8).buffered().use { writer ->
        writer.write(xmlString)
    }
}

注意事项

如果XML内容包含XML特殊字符(如<、>、&、"、'),禁用实体转义后需要手动转义这些字符,否则会导致XML格式错误。例如将<替换为&lt;,&替换为&amp;。

内容的提问来源于stack exchange,提问作者Danteee313

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:05:22