根本原因是服务端读取XML文件时使用的字符编码与XML声明的encoding属性不一致,如声明UTF-8却用GBK或ISO-8859-1解析;Java中需显式指定编码,避免依赖默认或强制UTF-8解码,应先提取XML声明中的encoding值再动态选择Charset。

XML文件上传后中文变成问号或方块
根本原因是服务端读取文件时使用的字符编码与XML声明的编码不一致。比如XML头写的是 ,但后端用 ISO-8859-1 或系统默认编码(如Windows上的 GBK)去解析字节流,必然乱码。
Java Servlet中读取XML文件必须显式指定编码
Servlet默认用 ISO-8859-1 解析请求体,对含中文的XML文件完全不可用。不能依赖 request.getCharacterEncoding()——它只对表单参数有效,对文件上传的原始字节流无效。
- 用
ServletInputStream读取原始字节,再手动按UTF-8构造字符串 - 若用Apache Commons FileUpload,务必在
DiskFileItemFactory后调用setHeaderEncoding("UTF-8"),否则文件名可能乱码 - 解析XML前,确认输入源是
InputStream而非Reader;用SAXParser或DocumentBuilder时传入带编码的InputSource
InputSource source = new InputSource(inputStream);
source.setEncoding("UTF-8");
documentBuilder.parse(source);
Spring Boot + MultipartFile 仍需校验XML声明编码
MultipartFile.getInputStream() 返回的是原始字节流,Spring不做自动编码转换。如果XML里声明了 encoding="GBK",而你用 new String(bytes, StandardCharsets.UTF_8) 强转,照样乱码。
v1.8新增功能简介: 一、后台新增生成网站地图和生成Sitemap.xml的功能。 二、新增下载中心功能,可在后台上传doc,xls,ppt,rar,pdf文件。 三、新增产品缩略图自动缩放功能,图片按比例缩放,解决了图片变形问题。 四、新闻、产品详细页新增了上一个、下一个的功能,改善用户体验。 五、在线客服新增了阿里巴巴贸易通在线客服。 六、可在后台设置分享代码,如百度分享和AddThis等。
- 先读取前几百字节,用正则提取
encoding="([^"]+)"的值 - 根据提取结果选择对应
Charset解码(注意处理encoding="utf-8"和encoding="UTF-8"大小写) - 避免直接用
multipartFile.getString(StandardCharsets.UTF_8)—— 它强制用UTF-8,忽略XML自身声明
Nginx或网关层可能静默转码
某些反向代理(如旧版Nginx + charset utf-8 配置)会对响应头注入 Content-Type: text/xml; charset=utf-8,但实际返回的XML字节仍是GBK编码,浏览器或客户端会按UTF-8解码,导致乱码。
- 检查响应头中的
Content-Type是否与XML文件实际编码一致 - 用
curl -v抓包确认原始响应体字节,再用xxd或十六进制编辑器比对中文部分的字节序列 - 网关层尽量不要重写
Content-Type,让后端自己控制









