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
相关产品推荐
相关产品推荐

