Java11 HttpClient下载中文文件名称乱码
0
不知道这个是不是BUG,记录一下。
下载文件如果文件名称含有中文时,设置文件名称一般有以下两种方式:
// 使用URL编码解决
//responseHeaders.add("Content-Disposition", "attachment; filename=" + UrlUtils.encode("蜗牛.txt"));
// 设置ISO-8859-1编码解决
responseHeaders.add("Content-Disposition", "attachment; filename=" + new String("蜗牛.txt".getBytes(), SystemConfig.CHARSET_ISO_8859_1));
URL编码这个在浏览器和HttpClient
都是没有问题的。
但是使用ISO-8859-1
编码时浏览器可以,但是HttpClient
却提示乱码。
最后发现不知道为什么HttpClient
这里可能存在byte
转为char
没有去符号& 0xFF
,所以这里就会出现这个问题。
解决办法:
final char[] chars = fileName.toCharArray();
for (int i = 0; i < chars.length; i++) {
// 转为ISO-8859-1单字节
chars[i] = (char) (chars[i] & 0x00FF);
}
fileName = new String(chars);
验证代码:
@Test
public void testChar() throws Exception {
// 错误代码:│ワラノロ.txt
var name = "蜗牛.txt";
read(new String(new String(name.getBytes(), "ISO-8859-1").getBytes()));
}
private void read(String name) throws Exception {
this.log(name);
var bytes = name.getBytes("ISO-8859-1");
var chars = name.toCharArray();
var chare = new char[bytes.length];
for (int i = 0; i < chars.length; i++) {
// this.log(bytes[i] + "=" + ((char) (bytes[i])) + "=" + ((char) (0xFF & bytes[i])));
// 如果不做0xFF操作异常
// chare[i] = (char) (bytes[i] & 0xFF); // 正常
chare[i] = (char) (bytes[i]); // 异常
}
this.log(new String(chare));
this.log(bytes.length);
this.log(bytes);
this.log(chars.length);
this.log(chars);
this.log(chars[0] & 0xFF);
}