java11 http正式_Java11 HttpClient下载中文文件名称乱码
不知道這個是不是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);
}
總結
以上是生活随笔為你收集整理的java11 http正式_Java11 HttpClient下载中文文件名称乱码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET高级软件工程师的面试题目
- 下一篇: 不小心点了计算机一键还原怎么操作,电脑按