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格式错误。例如将<替换为<,&替换为&。
内容的提问来源于stack exchange,提问作者Danteee313
相关产品推荐
相关产品推荐

