第一个问题:介绍两种解决Spring返回json到前台乱码的两种解决方法
a.注解的修改方式,在@RequestMapping中添加products="text/html;charset=utf-8"
@RequestMapping(value="/book/getBook.do", produces = "text/html;charset=UTF-8")
public @ResponseBody String getBook(String name){
List<Book> list =bookService.getBook();
for(Book bo:list){
System.out.println("id:"+bo.getId()+" name:"+bo.getName()+" author:"+bo.getAuthor());
}
String json = JSONObject.toJSONString(list);
System.out.println("json:"+json);
return json;
}
b.在返回值的时候将json的格式进行更改
response.setContentType("text/html;charset=UTF-8);
PrintWriter out = response.getWriter();
以上a方法亲测,改起来也比较顺手;b方法忘了试没试了,好奇的小伙伴可以搞一下
第二个问题:关于文件下载时中文文件名乱码的问题,通过上面注解的解决方式已经解决不了问题了,以上是针对json的,将json的格式更改为html格式来保全的,浏览器下载乱码主要是不同的浏览器内核不同,编码不同,所以要针对不同的浏览器来进行不同的编码
ie采用URLEncoder编码输出中文
opera采用filename
safari采用iso-8859-1
chrome采用base64或iso-8859-1
firefox采用base64或iso-8859-1
//获取用户浏览器信息
String Agent = request.getHeader("User-Agent");
if (null != Agent) {
Agent = Agent.toLowerCase();
if (Agent.indexOf("firefox") != -1) { //针对火狐
excelName = new String(excelName.getBytes(),"iso8859-1");
} else if (Agent.indexOf("msie") != -1) {
excelName = URLEncoder.encode(excelName,"UTF-8");//针对IE
} else {
excelName = URLEncoder.encode(excelName,"UTF-8"); //针对谷歌
}
}
response.addHeader("Content-Disposition","attachment;filename=" + excelName);
//-----------------------------------分割线有这么长-----------------------------------------
//如果对浏览器的要求不高,可以直接这样
if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
excelName = URLEncoder.encode(excelName, "UTF-8"); //IE浏览器
} else {
excelName = new String(excelName.getBytes("UTF-8"), "ISO8859-1"); //谷歌火狐
}
好了,就是这个样子。