Java使用URLConnection获取Content-Disposition响应头乱码如何解决
Java读取Content-Disposition响应头乱码修复方案
乱码根因
该乱码属于典型的HTTP头编码不匹配问题:
- 服务端写入
Content-Disposition的filename值时,将UTF-8编码的孟加拉语文本直接按ISO-8859-1编码写入响应头 - 客户端调用
URLConnection.getHeader()取值时,默认同样按ISO-8859-1解码,相当于把UTF-8的多字节流强行按单字节编码解析,就产生了你看到的Latin字符乱码
核心修复代码
1. 提取filename原始值
import java.net.URLConnection; import java.nio.charset.StandardCharsets; import java.util.regex.Matcher; import java.util.regex.Pattern; // 先获取响应头Content-Disposition内容 String disposition = connection.getHeaderField("Content-Disposition"); String fileName = null; if (disposition != null && disposition.contains("filename")) { // 匹配引号包裹的filename值 Pattern fileNamePattern = Pattern.compile("filename=\"?(.*?)\"?$", Pattern.CASE_INSENSITIVE); Matcher matcher = fileNamePattern.matcher(disposition); if (matcher.find()) { fileName = matcher.group(1); } }
2. 转码得到正确文本
拿到乱码的filename后,通过编码回退+重新解码得到正确的孟加拉语文本:
if (fileName != null) { // 核心转码逻辑:先按ISO-8859-1转回原始字节流,再用UTF-8解码 fileName = new String(fileName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); }
执行上述代码后,你给出的乱码文本就会被正确转译为৩টি ধাপে সহজেই আত্ববিশ্বাসী হয়ে উঠুন。
扩展兼容处理
如果服务端遵循RFC 5987规范,使用filename*=UTF-8''xxx格式传递编码后的文件名,需要增加百分号解码逻辑:
if (disposition != null && disposition.contains("filename*")) { Pattern rfc5987Pattern = Pattern.compile("filename\\*=.*?''(.*)$", Pattern.CASE_INSENSITIVE); Matcher rfcMatcher = rfc5987Pattern.matcher(disposition); if (rfcMatcher.find()) { String encodedName = rfcMatcher.group(1); fileName = URLDecoder.decode(encodedName, StandardCharsets.UTF_8); } }
内容的提问来源于stack exchange,提问作者Abhijit
相关产品推荐
相关产品推荐

