根本原因是声明、流、解析器三者编码不一致;XML写入须用OutputStreamWriter指定UTF-8并封装StreamResult,读取须用InputStreamReader指定UTF-8再包装InputSource,JSON输出需在HTTP层或IO层显式设UTF-8,且JVM、IDE、Maven全局编码必须统一为UTF-8。

Java 处理 XML 或 JSON 时出现中文乱码,根本原因不是“没设编码”,而是声明、流、解析器三者编码不一致。关键不在库本身,而在 IO 层和配置层的显式控制。
XML 写入文件:必须用 OutputStreamWriter 包装流
直接传 File 给 StreamResult 会使用平台默认编码(如 Windows 的 GBK),即使设置了 encoding="UTF-8" 声明,字节实际仍是乱码。
- 创建
Transformer后调用transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8") - 用
FileOutputStream构造OutputStreamWriter,并明确传入StandardCharsets.UTF_8 - 把该
OutputStreamWriter封装为StreamResult,再传给transform()
XML 读取文件:InputStreamReader 必须指定 UTF-8
即使 XML 文件开头写了 <?xml version="1.0" encoding="UTF-8"?>,DOM/SAX 解析器仍可能忽略它,转而依赖底层输入流的编码。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 不要用
new FileInputStream(file)直接构造InputSource - 改用
new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8) - 再包装成
InputSource交给DocumentBuilder.parse()
JSON 序列化输出:编码由 HTTP 层或写入方式决定
JSON 字符串本身是字符串对象,不带编码;但写入响应体、文件或网络流时,编码才生效。
立即学习“Java免费学习笔记(深入)”;
- Spring MVC 返回 JSON:在
@RequestMapping加produces = "application/json;charset=UTF-8" - 手动写入文件:用
Files.write(path, jsonString.getBytes(StandardCharsets.UTF_8)) - 用 Jackson/Gson 生成字符串后,若要写入流,务必用
OutputStreamWriter(out, UTF_8),而非直接PrintWriter(out)
全局兜底:JVM 和 IDE 编码必须统一为 UTF-8
即使每处都写了 UTF-8,若 JVM 默认编码不是 UTF-8,String.getBytes()、new String(byte[]) 等隐式操作仍会出错。
- 启动参数加
-Dfile.encoding=UTF-8 - IDEA 中设置:File → Settings → Editor → File Encodings → 全部选 UTF-8(含 Properties 文件)
- Maven 编译加
<encoding>UTF-8</encoding>,避免源码编译阶段就乱码

















