《深入分析javaweb技术内幕》第三章
浏览器会自动对url进行编码,不同浏览器用的编码集不同,可进行设置。
tomcat默认是用iso-8859-1对uri和get参数进行解码,所以如果这个过来的get参数是用的utf-8编码的,到了服务器端tomcat用iso8859-1解码就会出现乱码。
好像tomcat8默认用的是utf8,get请求中文不会乱码。
修改tomcat配置的解决方法:
修改配置文件server.xml <conntect URIEncoding="UTF-8"/>
,用utf-8对uri解码。
tomcat对get参数解码用的编码集,要么是Header的ContentType定义的charset,要么是默认的ISO-8859-1。
设置useBodyEncodingForURI=true
使tomcat使用ContentType的charset。这个属性是表示对get参数使用BodyEncoding进行解码而不是对整个uri。
不改tomcat配置:
在java中用iso8859-1解码后用utf-8编码
key = new String(key.getBytes("iso8859-1"), "utf-8");可以前端两次编码uri,到服务端两次解码uri,tomcat一次(ISO-8859-1),手动一次(utf-8)。
因为对英文字符来说UTF-8编码和ISO-8859-1编码的效果相同。
但是如果有特殊字符,就没法得到正确的结果。
ajax发请求时如果用encodeURI()用utf-8编码,浏览器会不会干涉再编码一次?
另外,
在java端处理url编解码有两个类,URLEncoder和URLDecoder。这两个类可以将所有“%”加utf-8码值用utf-8解码,从而得到原始的字符。