- 1.<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>jsp页面显示中文乱码:<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- jsp页面的编码方式有两个地方需要设置:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <%@<wbr>page<wbr>language=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"java"</span><wbr><span style="color:#7f055; line-height:18px; word-wrap:normal; word-break:normal; font-weight:bold">import</span>=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"java.util.*"</span><wbr>pageEncoding=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"utf-8"</span>%><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <%@<wbr>page<wbr>contentType=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"text/html;charset=utf-8"</span>%><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 其中:pageEncoding<wbr>指的是jsp文件本身在本地保存时的编码方式。contentType的charset是指服务器发送网页内容给客户端时所使用的编码。<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 从第一次访问一个jsp页面开始,到这个页面被发送到客户端,这个Jsp页面要经过三次编码转换:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8<wbr>JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 第二阶段是由JAVAC的JAVA源码至java<wbr>byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-<span style="color:#c000; line-height:18px; word-wrap:normal; word-break:normal">8</span>的encoding的java源码。<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- JAVAC用UTF-8的encoding读取java源码,编译成UTF-8<wbr>encoding的二进制码(即.<span style="color:#7f055; line-height:18px; word-wrap:normal; word-break:normal; font-weight:bold">class</span>),这是JVM对常数字串在二进制码(java<wbr>encoding)内表达的规范。<wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 第三阶段是Tomcat(或其的application<wbr>container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 所以最终的解决方法为:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 在jsp页面设置pageEncoding或者contentType的其中一个为支持中文的编码格式(如utf-8,gbk,gb2312)。因为设置一个的话,另一个默认会和它一样。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 如果两个都设置的话,必须保证两个都是支持中文编码(不一定要一样)。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr>最佳建议设置如下:<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <%@<wbr>page<wbr>language=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"java"</span><wbr><span style="color:#7f055; line-height:18px; word-wrap:normal; word-break:normal; font-weight:bold">import</span>=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"java.util.*"</span><wbr>pageEncoding=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"utf-8"</span>%><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <%@<wbr>page<wbr>contentType=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"text/html;charset=utf-8"</span>%><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 2.<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>post方式传值乱码:<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 由于post方式传值是通过request存储的,在另一个页面也是通过request.getParameter(String<wbr>name)来提取信息,所以这种情况下的乱码主要是因为request存储信息的编码设置导致的。post提交时,如果没有设置提交的编码格式,则会以iso8859-<span style="color:#c000; line-height:18px; word-wrap:normal; word-break:normal">1</span>方式进行提交,接受的jsp却以utf-<span style="color:#c000; line-height:18px; word-wrap:normal; word-break:normal">8</span>的方式接受。所以使用如下语句即可得到单个正确的中文字符串:String<wbr>str<wbr>=<wbr><span style="color:#7f055; line-height:18px; word-wrap:normal; word-break:normal; font-weight:bold">new</span><wbr>String(request.getParameter(<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"something"</span>).getBytes(<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"ISO-8859-1"</span>),<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"utf-8"</span>)<wbr>;<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 解决方法:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 在接收页面设置request.setCharacterEncoding("UTF-8")。最好通过过滤器实现每个页面都设置为request.setCharacterEncoding("UTF-8")。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 3.<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>get方式传值乱码:<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- get方式传值有两种,一种是表单get传值,另一种是url地址传值(实质上这两种方式都是通过url参数的方式传值)。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 表单方式get传值:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 表单方式get传值的编码过程为,首先浏览器根据页面的charset编码方式对传值进行编码,然后提交至服务器交给tomcat,tomcat对这些信息进行解码时,采用的解码方式是由server.xml文件中的URIEncoding设置决定的,也就是说,当我们使用命令request.getParameter("")获取表单参数值时,得到的字符串,经过了charset的编码和URIEncoding的解码。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 由上所知,只要charset的编码和URIEncoding的解码一致,并且支持中文,就能保证没有乱码。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 设置URIEncoding的方法如下:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 方法一:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 修改$TOMCAT/conf/server.xml文件,在HTTP<wbr>Connector或者AJP<wbr>Connector的配置加上URIEncoding=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"gbk"</span><wbr><wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><...<wbr><wbr><wbr>maxThreads=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"150"</span><wbr>minSpareThreads=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"25"</span><wbr>maxSpareThreads=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"75"</span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><wbr><wbr>enableLookups=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"false"</span><wbr>redirectPort=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"8443"</span><wbr>acceptCount=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"100"</span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr>connectionTimeout=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"20000"</span><wbr>disableUploadTimeout=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"true"</span><wbr>URIEncoding=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"gbk"</span><wbr>/><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr>方法二:<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 使用useBodyEncodingForURI="true".<wbr>这个方法适合你的TOMCAT实例下需要跑多个不同Encoding的程序时。<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <...<wbr><wbr>maxThreads=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"150"</span><wbr>minSpareThreads=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"25"</span><wbr>maxSpareThreads=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"75"</span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><wbr><wbr><wbr>enableLookups=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"false"</span><wbr>redirectPort=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"8443"</span><wbr>acceptCount=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"100"</span><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><wbr><wbr>connectionTimeout=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"20000"</span><wbr>disableUploadTimeout=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"true"</span><wbr>useBodyEncodingForURI=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"true"</span><wbr>/><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><wbr>enableLookups=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"false"</span><wbr>redirectPort=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"8443"</span><wbr>protocol=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"AJP/1.3"</span><wbr>useBodyEncodingForURI=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"true"</span><wbr>/><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 在Tomcat配置中,连接器(HTTP<wbr>Connector)属性中有一个URIEncoding和<wbr><wbr></wbr></wbr></wbr>
- useBodyEncodingForURI属性,这两个属性设置对URL后的附加参数进行URL解码时该如何选择<wbr>字符集编码。URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI<wbr>则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置,也就是说当<wbr>useBodyEncodingForURI属性设置为<span style="color:#7f055; line-height:18px; word-wrap:normal; word-break:normal; font-weight:bold">true</span>时ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/<wbr>conf\server.xml文件中找到<wbr><Connector>标记,然后在后面加上useBodyEncodingForURI=<span style="color:#7f055; line-height:18px; word-wrap:normal; word-break:normal; font-weight:bold">true</span>)<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- url方式get传值乱码:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至服务器tomcat,所以这个过程为:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 首先,url地址中的中文被从gbk转换成ISO-8859-1,交给tomcat后,又被tomcat根据URLEcoding解码,这种情况,只有把URLEcoding设置为gbk才能在request.getParameter("")时不出现乱码。但是这样就会影响到上面的配置,所以一个好的解决方法是,使用java.net.URLEcoder和URLDecoder对地址中的中文进行手动编码和解码。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 所以一个万全的解决方法为:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 1.所有页面的charset设置为UTF-8。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 2.Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 3.添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- 4.<wbr>url地址中存在中文参数时,首先对中文参数使用URLEcoder编码为utf-<span style="color:#c000; line-height:18px; word-wrap:normal; word-break:normal">8</span>,然后在request.getParameter(<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">""</span>)接收到参数后再使用URLDecoder还原。例如:<wbr><wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- From.jsp页面:<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <%String<wbr>username<wbr>=<wbr><span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"张某某"</span><wbr>;<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><wbr>username<wbr>=<wbr>URLEncoder.encode(username,<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"utf-8"</span>);<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><wbr>%><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <wbr><wbr><wbr><wbr><wbr><a<wbr>href=<span style="color:blue; line-height:18px; word-wrap:normal; word-break:normal">"to.jsp?param=<%=username<wbr>%>"</wbr></span>>转入</a><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- To.jsp页面<wbr><wbr></wbr></wbr>
- <wbr><wbr></wbr></wbr>
- <%=URLDecoder.decode(request.getParameter("param"),"utf-8")%><wbr></wbr>
-
-
-
-
- 总之 ,乱码的解决方案如下:
-
-
- post传值乱码时,在接收端设置request.setCharacterEncoding("UTF-8"); <wbr><span></span><wbr><wbr></wbr></wbr></wbr>
- -- 最好用过滤器设置,并且设置response.setContentType("text/html;charset=utf-8");
- <wbr></wbr>
- get传值或者url乱码时,手动设置接收的参数String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;<wbr></wbr>