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);
	}