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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:24:02