请问为什么
HttpServletRequest request = ServletActionContext.getRequest();
System.out.println(request.getCharacterEncoding());
打印出来的编码方式是:UTF-8 呢??我的tomcat server.xml并没用设置,也没用设置filter,不是应该默认是ISO-8859-1吗?
最主要的问题是既然是UTF-8编码,为什么
url是:http://localhost:8080/tuangou/getItemsByCategory?number=0&category=好好
action里面的代码是:number =Integer.parseInt(request.getParameter("number")) ;
category = request.getParameter("category");
System.out.println("number is ---" + number + "      category is " + category);systemout输出的是:number is ---0      category is ºÃºÃ乱码?求解:都好几天了,烦啊!!!

解决方案 »

  1.   

     在JSP/Servlet 中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、contentType="text/html;charset=UTF -8"、request.setCharacterEncoding("UTF-8")和response.setCharacterEncoding ("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet中。1、pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码。       众所周知,JSP在服务器上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的编码。通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding="UTF-8",就会引起JSP内部定义的字符串为乱码。       另外,该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码。2、contentType="text/html;charset=UTF-8"的作用是指定对服务器响应进行重新编码的编码。       在不使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码的编码。服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。3、request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码的编码。       该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。4、response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。       服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。       其次,要说一说浏览器是怎么样对接收和发送的数据进行编码的       response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在JSP中设置response.setCharacterEncoding ("UTF-8")或者response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正确设置了pageEncoding参数等)。读者可以做个实验,在JSP中设置 response.setCharacterEncoding("UTF-8"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码 (D)"中可以查看到是" Unicode(UTF-8)",而在在JSP中设置response.setCharacterEncoding ("GBK"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。       浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使用response.setCharacterEncoding参数来进行URL编码的。以百度和GOOGLE为例,如果你在百度中搜索"汉字",百度会将其编码为"%BA%BA%D7%D6"。而在GOOGLE中搜索 "汉字",GOOGLE会将其编码为"%E6%B1%89%E5%AD%97",这是因为百度的 response.setCharacterEncoding参数为GBK,而GOOGLE的的 response.setCharacterEncoding参数为UTF-8。       浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为JSP页面的response.setCharacterEncoding参数(或者contentType和 pageEncoding参数),我们称其为浏览器编码。当然,在IE中可以修改浏览器编码(在IE的菜单中选择"查看(V)"à"编码(D)"中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是,在IE中浏览GOOGLE的主页时,将浏览器编码修改为"简体中文(GB2312)",此时,页面上的中文会变成乱码,不理它,在文本框中输入"汉字",提交,GOOGLE会将其编码为"%BA%BA%D7%D6",可见,浏览器在对中文进行URL编码时,使用的就是浏览器编码。       弄清了浏览器是在接收和发送数据时,是如何对数据进行编码的了,我们再来看看服务器是在接收和发送数据时,是如何对数据进行编码的。       对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。       对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。       因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。       无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。       对于表单中POST方式提交的数据,只要在接收数据的JSP中正确设置request.setCharacterEncoding参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有写读者可能会问,那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览器编码就是你在响应该请求的JSP页面中response.setCharacterEncoding设置的值。所以对于POST表单提交的数据,在获得数据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的 response.setCharacterEncoding设置成相同的值。       对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO- 8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码)。要解决该问题,应该在Tomcat的配置文件的Connector标签中设置useBodyEncodingForURI或者 URIEncoding属性,其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding 参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false(Tomcat4.0中该参数默认为true); URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。 URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码(解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。下面总结下,以Tomcat5.0为WEB服务器时,如何防止中文乱码。1.对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。2.正确设置JSP的pageEncoding参数3.在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。4.对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF-8")。同时,要修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为 UTF-8(有可能影响其他应用,所以不推荐
      

  2.   

    System.out.println(request.getCharacterEncoding());
    这个获得的编码格式应该只能影响到post方式提交的,你尝试用post提交中文,后台不转码打印出来看看...
    category = request.getParameter("category");
    获取的这个category是通过get也就是URL传递的参数,http://localhost:8080/tuangou/getItemsByCategory?number=0&category=好好
    ,URL传递的时候web容器会进行一个URIEncoding的过程,估计就是这个过程导致你后台获取打印出来是乱码...以上只是我的观点,不一定正确,编码一直是个挺困扰人的问题...这是一篇很详细的说明,楼主可以看看:http://blog.csdn.net/windgoogle/article/details/4746550
      

  3.   

    这是我空间的一篇关于中文乱码的博文
    http://blog.csdn.net/kzl623/article/details/5925499
      

  4.   

    如果是get提交也有解决方法  可以再js中encodeuri  然后在后台  调用.net包中的 decode 方法 就可以得到中文了  struts2.1的中文转换有问题  你可以搜搜相关解决方法  好久没用 我忘了  实在抱歉
      

  5.   

    js中encodeuri 然后在后台 调用.net包中的 decode 方法 这个屡试不爽
      

  6.   


    顶,我也是一直这么解决的。
    form提交,还是ajax提交基本都可以解决的。
      

  7.   

     上面说的方法 要用post传参 
    url 里面默认是不支持中文的,必须把中文转换成 unicode 
    jdk的 net包下又一个转换工具,具体在哪忘了。另外 最好不要用url传参,尽量用post传参吧 !用get传带有中文的参数是个严重的问题!!!
      

  8.   

    _首先要说下 在struts2里面request.getCharacterEncoding()得到的编码,是被struts2核心控制器就是在web.xml里面配置的核心filter设置过后的,它默认设置是utf-8在default.property(struts2核心jar包里面)里面你可以看下它的配置struts.i18n.encoding=UTF-8,所以你得到的是utf-8很正常,至于在url中乱码是因为在web服务器中,url会使用服务器的默认编码配置,tomcat的是ISO_8859-1,你只要在tomcat 的server.xml增加: 
        <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" URIEncoding="UTF-8" /> 就可以了,谢谢
      

  9.   

    正解。Struts2中form要使用method="get"方法,应该在Tomcat\server.xml中找到
    <Connector port="8080" protocol="HTTP/1.1"  
      connectionTimeout="20000"  
      redirectPort="8443"/> 在redirectPort="8443"后面加上URIEncoding="UTF-8" 就OK了,记住要大写