在Java开发里,把XML文档对象转换成字符串是非常常见的操作,比如接口报文拼装、配置文件生成等。但不少人发现,转换后的字符串里中文变成了乱码,根源常常出在OutputFormat的编码配置上。

为什么会出现乱码
Java内部以Unicode处理字符,而XML输出到字符串或字节流时需要选定一种外部编码。如果使用了OutputFormat却没有调用setEncoding方法,很多类会退回到系统默认编码,例如GBK。当原始XML是UTF-8时,用GBK去解释字节就会产生乱码。
常见错误写法
下面这段代码没有设置编码,容易在中文环境出问题:
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.StringWriter;
public class XmlDemo {
public static String wrongToStr(Document doc) throws Exception {
OutputFormat format = new OutputFormat();
// 未设置编码,使用默认
StringWriter sw = new StringWriter();
XMLWriter writer = new XMLWriter(sw, format);
writer.write(doc);
writer.close();
return sw.toString();
}
}
正确设置OutputFormat编码
要避免乱码,必须明确指定与源数据一致的编码,通常推荐UTF-8,并且保证Writer本身也是按该编码工作。
推荐写法
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.StringWriter;
public class XmlDemo {
public static String rightToStr(Document doc) throws Exception {
// 显式设置编码为UTF-8
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
StringWriter sw = new StringWriter();
XMLWriter writer = new XMLWriter(sw, format);
writer.write(doc);
writer.close();
return sw.toString();
}
}
使用Transformer时的注意点
如果用标准Transformer,也要设置输出属性中的encoding:
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
public class TransformDemo {
public static String transform(org.w3c.dom.Document doc) throws Exception {
Transformer tf = TransformerFactory.newInstance().newTransformer();
// 设置输出编码
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StringWriter sw = new StringWriter();
tf.transform(new DOMSource(doc), new StreamResult(sw));
return sw.toString();
}
}
总结
XML转String乱码不是数据丢了,而是编码解释错了。无论用dom4j的OutputFormat还是标准Transformer,都要主动设置encoding为UTF-8,并保持读写两端编码统一,这样就能稳定输出正确字符串。
JavaXML转StringOutputFormat修改时间:2026-07-28 00:18:22