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

FTP下载XML转JSON后外文字符乱码,如何修正编码问题?

解决FTP下载UTF-8 XML转JSON后非英文字符显示问号的问题

非英文字符变成问号的核心原因是编码/解码环节不匹配,流程中某一步误用了平台默认编码(如GBK、ISO-8859-1)处理UTF-8字节,导致字符信息丢失。以下是针对性的修复步骤:

1. XML解析阶段:强制指定UTF-8编码

DocumentBuilder.parse(File)默认依赖XML文档的<?xml encoding="..."?>声明自动检测编码,若声明缺失或与实际编码不符,会直接导致解析错误。改为通过InputStreamReader显式指定UTF-8解析:

原代码:

doc = docBuilder.parse(xmlFile);

修改为:

try (InputStream is = new FileInputStream(xmlFile);
     Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
    doc = docBuilder.parse(new InputSource(reader));
}

2. XML转字符串阶段:确保输出编码为UTF-8

默认Transformer输出到StringWriter时,虽然后续转成String本身是UTF-16,但显式指定输出编码可避免后续转换的歧义:

原代码:

Transformer trans = tf.newTransformer();
StringWriter sw = new StringWriter();
trans.transform(new DOMSource(doc), new StreamResult(sw));
String xml = sw.toString();

修改为:

Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
trans.transform(new DOMSource(doc), new StreamResult(baos));
String xml = new String(baos.toByteArray(), StandardCharsets.UTF_8);

3. JSON序列化阶段:强制UTF-8输出

确保Jackson的ObjectMapper在序列化时使用UTF-8,避免默认编码导致字符转义或丢失:

原代码:

jsonMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);

补充编码配置:

jsonMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
// 强制JSON序列化采用UTF-8
jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 若输出到文件/流,显式指定UTF-8
try (FileWriter writer = new FileWriter(outputJsonFile, StandardCharsets.UTF_8)) {
    jsonMapper.writeValue(writer, xmlJSONObj);
}

4. 验证FTP下载环节

你已设置ftp.setFileType(FTP.BINARY_FILE_TYPE),这是正确的——二进制模式下载会完整保留原文件字节,不会破坏UTF-8编码。可通过文本编辑器(如Notepad++)打开下载后的文件,选择UTF-8编码查看非英文字符是否正常,确认下载环节无问题。

额外注意事项

  • 检查XML文档开头是否有<?xml version="1.0" encoding="UTF-8"?>声明,若无则必须强制指定UTF-8解析。
  • 所有涉及字节与字符转换的环节(读/写文件、字符串转换),均需显式指定StandardCharsets.UTF_8,切勿依赖平台默认编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:40:42