dom4j写入xml中文乱码的根本原因是未显式指定outputstreamwriter编码且未调用document.setxmlencoding("utf-8"),导致xml声明与实际字节编码不匹配。

DOM4J写入XML文件时中文变成问号或方块
根本原因是 XMLWriter 默认使用 UTF-8 编码写入,但没显式声明 XML 声明中的编码属性,或目标文件被其他程序(如 Windows 记事本)以 ANSI 打开误读。Java 运行时本身不乱,是读取端解析时编码不匹配。
- 必须在创建
XMLWriter时传入带指定编码的OutputStreamWriter,不能只靠OutputFormat.setEncoding("UTF-8") -
Document创建后、写入前,调用document.setXMLEncoding("UTF-8"),确保 XML 声明里出现<?xml version="1.0" encoding="UTF-8"?> - 避免直接用
FileOutputStream构造XMLWriter——它不处理字符编码,会走平台默认编码(Windows 上常是 GBK)
DOM4J生成XML后用浏览器/IDE打开显示乱码
这通常不是 DOM4J 的错,而是文件落地时编码与声明不一致,或工具自动识别失败。比如文件实际是 UTF-8,但没 BOM 且声明缺失,VS Code 或 IE 就可能当 GB2312 解析。
- 写入时强制指定
OutputStreamWriter编码:new OutputStreamWriter(new FileOutputStream("out.xml"), "UTF-8") - 确认
OutputFormat设置了编码:format.setEncoding("UTF-8"),且该 format 被传给XMLWriter构造函数 - 不要依赖系统默认编码:
new FileWriter("out.xml")是危险操作,它等价于new OutputStreamWriter(new FileOutputStream(...), Charset.defaultCharset()),Windows 下大概率是 GBK
DOM4J + 中文路径或文件名导致写入失败或乱码
这不是 XML 内容乱码,而是 FileOutputStream 构造时路径含中文,在旧版 JDK(如 1.6)或某些 IDE 启动参数未设 -Dfile.encoding=UTF-8 时,File 类内部字符串转字节过程出错,抛 FileNotFoundException 或生成空文件。
- 路径本身不用编码转换,但确保 JVM 启动时指定了字符集:
-Dfile.encoding=UTF-8 - 更稳妥的做法是把路径转成绝对路径,并用
Paths.get(...).toFile()替代字符串拼接,减少 File API 对编码的隐式依赖 - 如果必须支持中文路径且无法改 JVM 参数,可先用
java.net.URLEncoder.encode(path, "UTF-8")编码路径再构造File——但仅限调试,生产环境应避免中文路径
为什么 setEncoding("UTF-8") 不起作用
因为 OutputFormat.setEncoding() 只影响 XML 声明和文本内容序列化方式,它不会改变底层 Writer 的实际编码行为。如果传给 XMLWriter 的是一个没指定编码的 FileWriter,那所有设置都白搭。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
new XMLWriter(new FileWriter("a.xml"), format)——FileWriter已按系统默认编码打开流 - 正确写法:
new XMLWriter(new OutputStreamWriter(new FileOutputStream("a.xml"), "UTF-8"), format) - 验证是否生效:用十六进制编辑器打开生成的 XML,看前几个字节是不是
EF BB BF(UTF-8 BOM,可选),再看“中文”二字是否为连续 3 字节(如E4 B8 AD),而非 2 字节的 GBK 编码
OutputStreamWriter 编码和 document.setXMLEncoding() 两处,缺一不可。










