jersey ResponseBuilder 文件名编码

jas*_*mar 5 java jersey character-encoding jakarta-ee

在 javax.ws.rs.core.Response.ResponseBuilder 中,当我使用波兰语(德语、法语等)国家字符设置文件名时,它会在将响应发送到客户端之前更改文件名:

\n\n
ResponseBuilder response = Response.ok(file);\nresponse.header("Content-Disposition", "attachment; filename=\xc5\xbc\xc3\xb3\xc5\x82ty.txt");\n
Run Code Online (Sandbox Code Playgroud)\n\n

此后,文件将被下载为“-\xc3\xb3Bty.txt”。如何解决这个问题?

\n\n

编辑:\n整个应用程序可以使用 UTF-8 正常工作(例如,json 内容包含波兰语字符)。只有 http headers 没有。

\n

jas*_*mar 6

好的,我找到了解决方案。根据RFC 6266,不应在标头中使用非 ASCII 字符,而应使用 url 编码值。对于这种情况有特殊的语法:

String encodedFileName = URLEncoder.encode(file.getName(), "UTF-8");
response.header("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
Run Code Online (Sandbox Code Playgroud)