项目中用到一个spring3的接口,地址这种形式:http://localhost:8080/suzhou/service/searchBooks?queryString=测试
但是由于是中文输入,后台获取数据时解析一直不正确,网上查阅了很多资料,最多的一种说法是:
queryString = new String(queryString.getBytes("ISO-8859-1"), "UTF-8");
但是这种方法对我没用,一直想不通,尝试了各种方式,可返回的都是“???”这种问号形式
直到我看到一篇文章,讲的是JAVA中各种编码的转换,说到转换成GBK时候会产生问号,于是我把代码改成
queryString = new String(queryString.getBytes("ISO-8859-1"), "GBK");
奇迹出现了!这次返回的正确了。
但是为什么GBK就对了呢?我总结了下,这是由于我的系统默认编码是GBK的缘故。
查看系统默认编码可以通过下面的代码来执行:Charset.defaultCharset()
因此更通用的解决方式是:queryString = new String(queryString.getBytes("ISO-8859-1"), Charset.defaultCharset());
就可以了!
看到现在网上很多文章都是抄来抄去感觉很莫名其妙,一看到乱码就是new String(queryString.getBytes("ISO-8859-1"), "UTF-8");要么就是让别人修改tomcat里面的server.xml,根本没好好考虑过为什么要这么改,UTF-8不是万金油,用它是有原因的。如果你的系统默认是GBK的,那么你强行用UTF-8转码,只会越转越乱。
/**
* 根据字段名搜索
* @param queryString
* @return
*/
@RequestMapping(value="/searchBooks",method=RequestMethod.GET)
public @ResponseBody List<BookInfo> searchBooks(@RequestParam("queryString") String queryString) throws Exception {
System.out.println("queryString----------------->"+queryString);
queryString = new String(queryString.getBytes("ISO-8859-1"), Charset.defaultCharset());
System.out.println("queryString----------------->"+queryString);
BookDao dao = new BookDaoImpl();
List<BookInfo> list = dao.searchBooks(queryString);
return list;
}