1. URLEncoder.encode方法会将所有“不符合”application/x-www-form-urlencoded格式的字符进行编码。如果你指望让它只对 http://localhost:8080/hello/中文/test.jsp?城市=北京 这样一个地址中的中文进行编码,然后拿去sendredirect的话,是不行的。
按照utf-8编码后的结果是:http%3A%2F%2Flocalhost%3A8080%2Fhello%2F%E4%B8%AD%E6%96%87%2Ftest.jsp%3F%E5%9F%8E%E5%B8%82%3D%E5%8C%97%E4%BA%AC
2.URI中中的编码情况:浏览器自己决定编码方式,服务器根据配置的编码格式来解码,程序中无法控制。程序可以控制的是http报文正文内容(即要么是POST过来的表单内容,要么是响应给浏览器的html文档等)的编码解码方式:HttpServletRequest.setCharacterEncoding方法设置请求中来的数据编码格式;HttpServletResponse.setCharacterEncoding方法设置发给浏览器的数据的编码格式,但是浏览器不一定会按照此设置来解析,浏览器很可能按照收到的文档中的格式说明来解析。
只要弄清楚这里的编解码层级架构,就不会出现乱码问题,包括URI中也是可以出现中文路径的。(注意,js中的编码比较特殊,详见大牛的分解:http://www.ruanyifeng.com/blog/2014/12/unicode.html)
3.HttpServletResponse.setCharacterEncoding方法无法设置GBK/gb2312等编码,如果设置成这些编码,实际上还是使用的是默认编码。暂时还不知道原因。