UTF-8编码XML输入流写入日志出现转义字符如何解决
问题分析与解决方案
问题根源
- 当前处理逻辑为按行读取后逐行URL解码,但编码后的内容中换行符是以
%0A形式存在的,并非原生换行符。BufferedReader.readLine()只会识别原生\n/\r\n作为行分隔符,导致读取到的单行内容包含大量未拆分的编码字符,逐行解码无法正确处理全量编码内容。 - 直接传入XML记事本文件时,内容本身未经过URL编码,不需要解码步骤,因此可以正常输出。
修复代码
调整逻辑为:先读取输入流的全部内容为完整的编码字符串,再统一做URL解码,不要按行处理:
import java.nio.charset.StandardCharsets; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URLDecoder; import java.util.stream.Collectors; // 读取完整输入流内容为编码字符串 BufferedReader reader = new BufferedReader(new InputStreamReader(this.encodedInputStream, StandardCharsets.UTF_8)); String encodedContent = reader.lines().collect(Collectors.joining("\n")); String result = ""; try { // 对全量内容统一做URL解码 result = URLDecoder.decode(encodedContent, StandardCharsets.UTF_8.name()); } catch (Exception e) { log.error("Exception while logging WSCallMFE", e); } log.info(result);
补充说明
- 若输入流来自HTTP传输等场景,需确认发送端逻辑为「先对XML内容做URL编码,再写入流」,保证编解码逻辑对齐。
- 编解码统一使用
StandardCharsets.UTF_8指定字符集,避免不同环境默认编码不一致引发的乱码问题。
内容的提问来源于stack exchange,提问作者Bhanu
相关产品推荐
相关产品推荐

