在http中响应头的编码只能是ISO编码或者ASCII码,但是在文件上传或者下载中在请求头中一般会把文件名写入进去,如果文件名是中文则会乱码。
在spring的配置文件中我为tomcat加了url的编码规则为utf-8并把http的字符集也设置成utf-8可是还是乱码,后面通过了解http的编码发现tomcat不支持ISO和ASCII码以外的编码设置成的响应头或者请求头。如果是这两种编码以外的格式则会报错无效参数
.IllegalArgumentException: The Unicode character [中] at code point [35,828] cannot be encoded as it is outside the permitted range of 0 to 255
我开始的尝试如下设置全局的编码规则
server:
servlet:
encoding:
charset: utf-8
enabled: true
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
这个配置对请求头或者响应头的乱码并没有帮助不过可以设置全局的编码方式。
解决方式
String fileName = "中文名.file"
// 错误方式
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
// 正常做法 使用URL编码工具对字符编码,前端在进行解码
response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName) + "\";charset=utf-8");
使用URLEncoder.encode(fileName)方式浏览器浏览器访问会自动解码,以下就是响应头或者请求头乱码的完美解决方式。