第一个问题:介绍两种解决Spring返回json到前台乱码的两种解决方法html
a.注解的修改方式,在@RequestMapping中添加products="text/html;charset=utf-8"java
@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的格式进行更改chrome
response.setContentType("text/html;charset=UTF-8); PrintWriter out = response.getWriter();
以上a方法亲测,改起来也比较顺手;b方法忘了试没试了,好奇的小伙伴能够搞一下json
第二个问题:关于文件下载时中文文件名乱码的问题,经过上面注解的解决方式已经解决不了问题了,以上是针对json的,将json的格式更改成html格式来保全的,浏览器下载乱码主要是不一样的浏览器内核不一样,编码不一样,因此要针对不一样的浏览器来进行不一样的编码浏览器
ie采用URLEncoder编码输出中文
app
opera采用filename编码
safari采用iso-8859-1firefox
chrome采用base64或iso-8859-1excel
firefox采用base64或iso-8859-1code
//获取用户浏览器信息 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"); //谷歌火狐 }
好了,就是这个样子。