jsp页面中文解决办法

关于JSP页面之间传值的中文乱码总结

用过滤器来解决JSP中文乱码问题

URLEncoder.encode与URLDecoder.docode传递中文参数编码与解码

URLEncoder与URLDecoder的使用

-------------------------------------------------------------------------------------------------------

本部分转载自:http://blog.csdn.net/gongxifacai_believe/article/details/51605776

最近在各位大哥的帮助下,终于解决了jsp页面之间的传值问题,总结如下:

源代码,a.jsp往b.jsp传值:

a.jsp页面内容:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<form action="b.jsp">

name:<input type=text name=name>

<input type=submit>

</form>

b.jsp页面内容:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<%

String name=request.getParameter("name");

%>

<body>

<%=name%>

</body>

现象:中文乱码,比如“??????”

解决方法如下:

方法一:

1.         在b.jsp中把pageEncoding="GB2312"改为pageEncoding="ISO8859-1"

虽然这样b.jsp页面显示的内容还是乱码,但是不是那种“??????”的乱码,而是一些特殊字符

2.         然后在浏览器中查看菜单中修改成GB2312的编码,这时乱码就显示中文了。

3.         但是这种方法是不可行的。

方法二:

1.         在b.jsp中把String name=request.getParameter("name");修改为

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");

2.         这时再在页面上显示,则就是中文了。

3.         但是我个人不喜欢这种方法,因为编写起来代码非常繁琐

方法三:

1.         有人说修改get/post的传值方式,但是这是有前提的,如果只是把get方式修改成post方式,页面结果还是乱码!

2.         前提你必须配置了过滤器,若果你只是配置了过滤器,则传值方式必须是:post方式才不是乱码,如果是get方式照样是乱码!

3.         过滤器的配置,我想大家都能有,我就不说了

方法四:

1.         有人说配置tomcat的配置文件server.xml里这句:

<Connector URIEncoding="GB2312"

port="8080"   maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

connectionTimeout="20000" disableUploadTimeout="true" />

加上这句:URIEncoding="GB2312"

2.         虽然可以但是有前提的,若果你过滤器没有配置,则只是配置了server.xml文件,这样只有在表单是get传值时候才可以!当是post方式时,照样是乱码!

*这时我们就可以看出在tomcat5中的post与get传值方式是不一样的*

*有人要问有没有一种方法让传值使用get方式或post方式都好用呢,下面就是我推荐的方法五*

方法五:

1.         其实很简单,就是同时实现方法三又实现方法四!

2.         就是先配置过滤器,又配置server.xml文件,都设置成GB2312的编码

3.         这样无论是post还是get方式的表单传值,中文都不会是乱码!

这些只是jsp页面的传值中文字符乱码解决,对于jsp与数据库之间小妹还有待研究

有什么好文章也希望大家给推荐一下

------------------------------------------------------------------------------------------------------------

本部分转载自:用过滤器来解决JSP中文乱码问题

[java] view plain copy

  1. 1 package com.util;
  2. 2
  3. 3 import java.io.IOException;
  4. 4 import java.io.UnsupportedEncodingException;
  5. 5
  6. 6 import javax.servlet.Filter;
  7. 7 import javax.servlet.FilterChain;
  8. 8 import javax.servlet.FilterConfig;
  9. 9 import javax.servlet.ServletException;
  10. 10 import javax.servlet.ServletRequest;
  11. 11 import javax.servlet.ServletResponse;
  12. 12 import javax.servlet.http.HttpServletRequest;
  13. 13 import javax.servlet.http.HttpServletRequestWrapper;
  14. 14 import javax.servlet.http.HttpServletResponse;
  15. 15 import javax.servlet.http.HttpSession;
  16. 16
  17. 17
  18. 18 //过滤器处理表单传到servlet的乱码问题
  19. 19 public class MyFilter implements Filter{
  20. 20     //自写一个request换掉原来的request,重写里面的getParemeter方法,可以设置编码
  21. 21     class MyRequest extends HttpServletRequestWrapper{
  22. 22
  23. 23         @Override
  24. 24         public String getParameter(String param) {
  25. 25             String value = null;
  26. 26             try {
  27. 27                 //post
  28. 28                 super.setCharacterEncoding(encoding);//把编码转换为encoding
  29. 29                 value = super.getParameter(param);
  30. 30                 if(super.getMethod().equalsIgnoreCase("GET")){
  31. 31                     if(value!=null){
  32. 32                         value = new String(value.getBytes("iso8859-1"),encoding);
  33. 33                     }
  34. 34                 }
  35. 35             } catch (UnsupportedEncodingException e) {
  36. 36                 // TODO Auto-generated catch block
  37. 37                 e.printStackTrace();
  38. 38             }
  39. 39             return value;
  40. 40         }
  41. 41
  42. 42         public MyRequest(HttpServletRequest request) {
  43. 43             super(request);
  44. 44         }
  45. 45
  46. 46     }
  47. 47     protected String encoding=null;
  48. 48     public void destroy() { //销毁
  49. 49         // TODO Auto-generated method stub
  50. 50         this.encoding=null;
  51. 51     }
  52. 52    //对编码问题进行转换
  53. 53     public void doFilter(ServletRequest request, ServletResponse response,
  54. 54             FilterChain chain) throws IOException, ServletException {
  55. 55         // TODO Auto-generated method stub
  56. 56         response.setContentType("text/html;charset="+encoding);
  57. 57         //过滤未登录用户
  58. 58         HttpServletRequest req = (HttpServletRequest) request;
  59. 59         HttpServletResponse resp = (HttpServletResponse) response;
  60. 60         String path=req.getServletPath();
  61. 61         String param=req.getQueryString();
  62. 62         if(path!=null){
  63. 63             path=path+"?"+param;//全请求路径
  64. 64         }
  65. 65         if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){
  66. 66             HttpSession session = req.getSession();
  67. 67             String userName = (String) session.getAttribute("username");
  68. 68             if(userName == null){
  69. 69                 session.setAttribute("url", path.replaceFirst("/", ""));
  70. 70                 System.out.println(session.getAttribute("url"));
  71. 71                 resp.sendRedirect("user.do?op=loginAction");
  72. 72                 return;
  73. 73             }
  74. 74         }
  75. 75         //把过滤器给下一个过滤器或资源处理器
  76. 76         chain.doFilter(new MyRequest((HttpServletRequest) request), response);
  77. 77     }
  78. 78
  79. 79     public void init(FilterConfig filterConfig) throws ServletException {
  80. 80         // TODO Auto-generated method stub
  81. 81         this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定
  82. 82     }
  83. 83
  84. 84 }

然后在web.xml对该过滤器进行注册和映射:

[html] view plain copy

  1. <filter>
  2. <filter-name>EncodingFilter</filter-name>
  3. <filter-class>com.util.MyFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>EncodingFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping></span>

上面写的过滤器MyFilter类,本来只能处理post提交的数据(post是先处理后接收,get是先接收后处理)。

但是MyFilter里面在对任何页面过滤的时候,来了一个偷梁换柱:把原来客户端请求的request给换掉了,换成自己定义的一个request了,即内部类MyRequest,不过该类要继承一个类HttpServletRequestWrapper。

在自定义的一个内部类MyRequest里面,实现了一个好强大的功能,就是重写了request的getParameter()方法。该方法里面即处理了post提交,又能处理get提交,返回的值就是处理后的值,所以该过滤器就能实现处理post和get提交的乱码问题!

--------------------------------------------------------------------------------------------------

本部分转载自:URLEncoder.encode与URLDecoder.docode传递中文参数编码与解码

在传递参数的时候,如果有中文,那么可以先转码再转,之后再解码。

使用java.net.URLEncoder.encode()可以对要传递的中文进行编码

a.在传参数之前先把参数进行转码:java.net.URLEncoder.encode(param);

取值时用语句java.net.URLDecoder.decode(param);再转回中文

b.在你的Tomcat目录-->conf目录-->server.xml里找出这段:

<Connector

port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

debug="0" connectionTimeout="20000"

disableUploadTimeout="true"

<!--在里边加上这个参数-->

URIEncoding="gb2312"

/>

前端的写法:

<%@ page contentType="text/html;charset=gb2312" %>

<a href="ds.jsp?url=<%=java.net.URLEncoder.encode("编码的是这里","GB2312")%>">点击这里</a>

使用java.net.URLDecoder.decode()在后面对传递的参数进行解码,一定要搭配使用哦

<%

if(request.getParameter("url")!=null)

{

str=request.getParameter("url");

str=java.net.URLDecoder.decode(str,"GB2312");

str=new String(str.getBytes("ISO-8859-1"));

out.print(str);

}

%>

若,字符编码为utf-8也可以实现.或者在此段代码中,不写出字符编码也可以(只写一个参数)。

ajax写法:

$.ajax({

url:‘<%=request.getContextPath()%>/cargroup-ajax/searchCargroupName.action‘,

async:false,

data:{

cargroupName:encodeURI(cargroupName) //中文

},

type:‘post‘,

dataType:‘json‘,

success:function(data){

if(data=="true"){

if(flag!="form"){

alert("该名称可用!");

}

checkRepeat = true;

}else{

if(flag!="form"){

alert("该名称不可用!");

}

}

}

});

后台java:

cargroupName = URLDecoder.decode(request.getParameter("cargroupName"), "utf-8");

--------------------------------------------------------------------------------------------------------------

本部分转载自:URLEncoder与URLDecoder的使用

今天传url的时候乱码了。先说情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")来获取,jsp中的是GBK的编码,服务器用的是jboss,里面有个server.xml有如下配置。

[html] view plain copy

  1. <Connector port="80" address="${jboss.bind.address}"
  2. maxThreads="250" maxHttpHeaderSize="8192"
  3. emptySessionPath="true" protocol="HTTP/1.1"
  4. enableLookups="false" redirectPort="8443" acceptCount="100"
  5. connectionTimeout="20000" disableUploadTimeout="true" URIENCODING="UTF-8"/>

之前是没有uriencoding这个属性的,我给干掉,问题解决,这时候用的是默认值即ISO-8859-1。

关于server.xml的配置可以参考这个url的文档

http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html

问题解决的过程中,我特意研究了一下urlencode和urldecode这两个类,之所以没有用这种方案是因为我获得页面上的连接的时候用的是一个开源的叫做Cloud的类。

网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码; 2.将空格转换为加号 (+) ; 3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值; 4.在每个 name=value 对之间放置 & 符号。

编码过程非常简单,任何字符只要不是ASCII码数字,字母,或者前面提到的标点符,它们都将被转换成字节形式,每个字节都写成这种形式:一个“%”后面跟着两位16进制的数值。空格是一个特殊情况,因为它们太平常了。它除了被编码成“%20”以外,还能编码为一个“+”。加号(+)本身被编码为%2B。当/ # = & 和?作为名字的一部分来使用时,而不是作为URL部分之间的分隔符来使用时,它们都应该被编码。

类URL并不自动执行编码或解码工作。你能生成一个URL对象,它可以包括非法的ASCII和非ASCII字符和/或%xx。当用方法getPath() 和toExternalForm( ) 作为输出方法时,这种字符和转移符不会自动编码或解码。你应对被用来生成一个URL对象的字符串对象负责,确保所有字符都会被恰当地编码。

URLencode这个类负责把String编码成平台上的通用形式,urldecode类可以把url转换成string格式。

下面是urlencode的demo:

[java] view plain copy

  1. public static void main(String[] args) {
  2. try {
  3. System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));
  4. System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));
  5. System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));
  6. System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));
  7. System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));
  8. System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));
  9. System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));
  10. System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));
  11. System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));
  12. System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));
  13. System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));
  14. System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));
  15. System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));
  16. System.out.println(URLEncoder.encode("this中华人民共和国","UTF-8"));
  17. } catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");
  18. }
  19. }

执行结果如下:

[java] view plain copy

  1. This+string+has+spaces
  2. This*string*has*asterisks
  3. This%25string%25has%25percent%25signs
  4. This%2Bstring%2Bhas%2Bpluses
  5. This%2Fstring%2Fhas%2Fslashes
  6. This%22string%22has%22quote%22marks
  7. This%3Astring%3Ahas%3Acolons
  8. This%7Estring%7Ehas%7Etildes
  9. This%28string%29has%28parentheses%29
  10. This.string.has.periods
  11. This%3Dstring%3Dhas%3Dequals%3Dsigns
  12. This%26string%26has%26ersands
  13. This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters
  14. this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD

很明显url中有/%&=这类字符也会被编码,对于我们来说是不对的。例如

[java] view plain copy

  1. public static void main(String[] args) {
  2. try {
  3. System.out.println(URLEncoder.encode("pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3","UTF-8"));
  4. } catch (UnsupportedEncodingException e) {
  5. e.printStackTrace();
  6. }
  7. }

这个结果就是不对的了,会有如下输出:

pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

所以这种情形我们要对每一部分做分段encode

[java] view plain copy

  1. pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

对于urldecoder类来说

它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符

直接上demo:

[java] view plain copy

  1. public static void main(String[] args) {
  2. String input = "http://www.altavista.com/cgi-bin/" + "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";
  3. String output;
  4. try {
  5. output = URLDecoder.decode(input, "UTF-8");
  6. System.out.println(output);
  7. } catch (UnsupportedEncodingException e) {
  8. e.printStackTrace();
  9. }
  10. }

关于JSP页面之间传值的中文乱码总结

用过滤器来解决JSP中文乱码问题

URLEncoder.encode与URLDecoder.docode传递中文参数编码与解码

URLEncoder与URLDecoder的使用

-------------------------------------------------------------------------------------------------------

本部分转载自:关于JSP页面之间传值的中文乱码总结

最近在各位大哥的帮助下,终于解决了jsp页面之间的传值问题,总结如下:

源代码,a.jsp往b.jsp传值:

a.jsp页面内容:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<form action="b.jsp">

name:<input type=text name=name>

<input type=submit>

</form>

b.jsp页面内容:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<%

String name=request.getParameter("name");

%>

<body>

<%=name%>

</body>

现象:中文乱码,比如“??????”

解决方法如下:

方法一:

1.         在b.jsp中把pageEncoding="GB2312"改为pageEncoding="ISO8859-1"

虽然这样b.jsp页面显示的内容还是乱码,但是不是那种“??????”的乱码,而是一些特殊字符

2.         然后在浏览器中查看菜单中修改成GB2312的编码,这时乱码就显示中文了。

3.         但是这种方法是不可行的。

方法二:

1.         在b.jsp中把String name=request.getParameter("name");修改为

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312");

2.         这时再在页面上显示,则就是中文了。

3.         但是我个人不喜欢这种方法,因为编写起来代码非常繁琐

方法三:

1.         有人说修改get/post的传值方式,但是这是有前提的,如果只是把get方式修改成post方式,页面结果还是乱码!

2.         前提你必须配置了过滤器,若果你只是配置了过滤器,则传值方式必须是:post方式才不是乱码,如果是get方式照样是乱码!

3.         过滤器的配置,我想大家都能有,我就不说了

方法四:

1.         有人说配置tomcat的配置文件server.xml里这句:

<Connector URIEncoding="GB2312"

port="8080"   maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

connectionTimeout="20000" disableUploadTimeout="true" />

加上这句:URIEncoding="GB2312"

2.         虽然可以但是有前提的,若果你过滤器没有配置,则只是配置了server.xml文件,这样只有在表单是get传值时候才可以!当是post方式时,照样是乱码!

*这时我们就可以看出在tomcat5中的post与get传值方式是不一样的*

*有人要问有没有一种方法让传值使用get方式或post方式都好用呢,下面就是我推荐的方法五*

方法五:

1.         其实很简单,就是同时实现方法三又实现方法四!

2.         就是先配置过滤器,又配置server.xml文件,都设置成GB2312的编码

3.         这样无论是post还是get方式的表单传值,中文都不会是乱码!

这些只是jsp页面的传值中文字符乱码解决,对于jsp与数据库之间小妹还有待研究

有什么好文章也希望大家给推荐一下

------------------------------------------------------------------------------------------------------------

本部分转载自:用过滤器来解决JSP中文乱码问题

[java] view plain copy

  1. 1 package com.util;
  2. 2
  3. 3 import java.io.IOException;
  4. 4 import java.io.UnsupportedEncodingException;
  5. 5
  6. 6 import javax.servlet.Filter;
  7. 7 import javax.servlet.FilterChain;
  8. 8 import javax.servlet.FilterConfig;
  9. 9 import javax.servlet.ServletException;
  10. 10 import javax.servlet.ServletRequest;
  11. 11 import javax.servlet.ServletResponse;
  12. 12 import javax.servlet.http.HttpServletRequest;
  13. 13 import javax.servlet.http.HttpServletRequestWrapper;
  14. 14 import javax.servlet.http.HttpServletResponse;
  15. 15 import javax.servlet.http.HttpSession;
  16. 16
  17. 17
  18. 18 //过滤器处理表单传到servlet的乱码问题
  19. 19 public class MyFilter implements Filter{
  20. 20     //自写一个request换掉原来的request,重写里面的getParemeter方法,可以设置编码
  21. 21     class MyRequest extends HttpServletRequestWrapper{
  22. 22
  23. 23         @Override
  24. 24         public String getParameter(String param) {
  25. 25             String value = null;
  26. 26             try {
  27. 27                 //post
  28. 28                 super.setCharacterEncoding(encoding);//把编码转换为encoding
  29. 29                 value = super.getParameter(param);
  30. 30                 if(super.getMethod().equalsIgnoreCase("GET")){
  31. 31                     if(value!=null){
  32. 32                         value = new String(value.getBytes("iso8859-1"),encoding);
  33. 33                     }
  34. 34                 }
  35. 35             } catch (UnsupportedEncodingException e) {
  36. 36                 // TODO Auto-generated catch block
  37. 37                 e.printStackTrace();
  38. 38             }
  39. 39             return value;
  40. 40         }
  41. 41
  42. 42         public MyRequest(HttpServletRequest request) {
  43. 43             super(request);
  44. 44         }
  45. 45
  46. 46     }
  47. 47     protected String encoding=null;
  48. 48     public void destroy() { //销毁
  49. 49         // TODO Auto-generated method stub
  50. 50         this.encoding=null;
  51. 51     }
  52. 52    //对编码问题进行转换
  53. 53     public void doFilter(ServletRequest request, ServletResponse response,
  54. 54             FilterChain chain) throws IOException, ServletException {
  55. 55         // TODO Auto-generated method stub
  56. 56         response.setContentType("text/html;charset="+encoding);
  57. 57         //过滤未登录用户
  58. 58         HttpServletRequest req = (HttpServletRequest) request;
  59. 59         HttpServletResponse resp = (HttpServletResponse) response;
  60. 60         String path=req.getServletPath();
  61. 61         String param=req.getQueryString();
  62. 62         if(path!=null){
  63. 63             path=path+"?"+param;//全请求路径
  64. 64         }
  65. 65         if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){
  66. 66             HttpSession session = req.getSession();
  67. 67             String userName = (String) session.getAttribute("username");
  68. 68             if(userName == null){
  69. 69                 session.setAttribute("url", path.replaceFirst("/", ""));
  70. 70                 System.out.println(session.getAttribute("url"));
  71. 71                 resp.sendRedirect("user.do?op=loginAction");
  72. 72                 return;
  73. 73             }
  74. 74         }
  75. 75         //把过滤器给下一个过滤器或资源处理器
  76. 76         chain.doFilter(new MyRequest((HttpServletRequest) request), response);
  77. 77     }
  78. 78
  79. 79     public void init(FilterConfig filterConfig) throws ServletException {
  80. 80         // TODO Auto-generated method stub
  81. 81         this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定
  82. 82     }
  83. 83
  84. 84 }

然后在web.xml对该过滤器进行注册和映射:

[html] view plain copy

  1. <filter>
  2. <filter-name>EncodingFilter</filter-name>
  3. <filter-class>com.util.MyFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>EncodingFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping></span>

上面写的过滤器MyFilter类,本来只能处理post提交的数据(post是先处理后接收,get是先接收后处理)。

但是MyFilter里面在对任何页面过滤的时候,来了一个偷梁换柱:把原来客户端请求的request给换掉了,换成自己定义的一个request了,即内部类MyRequest,不过该类要继承一个类HttpServletRequestWrapper。

在自定义的一个内部类MyRequest里面,实现了一个好强大的功能,就是重写了request的getParameter()方法。该方法里面即处理了post提交,又能处理get提交,返回的值就是处理后的值,所以该过滤器就能实现处理post和get提交的乱码问题!

--------------------------------------------------------------------------------------------------

本部分转载自:URLEncoder.encode与URLDecoder.docode传递中文参数编码与解码

在传递参数的时候,如果有中文,那么可以先转码再转,之后再解码。

使用java.net.URLEncoder.encode()可以对要传递的中文进行编码

a.在传参数之前先把参数进行转码:java.net.URLEncoder.encode(param);

取值时用语句java.net.URLDecoder.decode(param);再转回中文

b.在你的Tomcat目录-->conf目录-->server.xml里找出这段:

<Connector

port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

debug="0" connectionTimeout="20000"

disableUploadTimeout="true"

<!--在里边加上这个参数-->

URIEncoding="gb2312"

/>

前端的写法:

<%@ page contentType="text/html;charset=gb2312" %>

<a href="ds.jsp?url=<%=java.net.URLEncoder.encode("编码的是这里","GB2312")%>">点击这里</a>

使用java.net.URLDecoder.decode()在后面对传递的参数进行解码,一定要搭配使用哦

<%

if(request.getParameter("url")!=null)

{

str=request.getParameter("url");

str=java.net.URLDecoder.decode(str,"GB2312");

str=new String(str.getBytes("ISO-8859-1"));

out.print(str);

}

%>

若,字符编码为utf-8也可以实现.或者在此段代码中,不写出字符编码也可以(只写一个参数)。

ajax写法:

$.ajax({

url:‘<%=request.getContextPath()%>/cargroup-ajax/searchCargroupName.action‘,

async:false,

data:{

cargroupName:encodeURI(cargroupName) //中文

},

type:‘post‘,

dataType:‘json‘,

success:function(data){

if(data=="true"){

if(flag!="form"){

alert("该名称可用!");

}

checkRepeat = true;

}else{

if(flag!="form"){

alert("该名称不可用!");

}

}

}

});

后台java:

cargroupName = URLDecoder.decode(request.getParameter("cargroupName"), "utf-8");

--------------------------------------------------------------------------------------------------------------

本部分转载自:URLEncoder与URLDecoder的使用

今天传url的时候乱码了。先说情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")来获取,jsp中的是GBK的编码,服务器用的是jboss,里面有个server.xml有如下配置。

[html] view plain copy

  1. <Connector port="80" address="${jboss.bind.address}"
  2. maxThreads="250" maxHttpHeaderSize="8192"
  3. emptySessionPath="true" protocol="HTTP/1.1"
  4. enableLookups="false" redirectPort="8443" acceptCount="100"
  5. connectionTimeout="20000" disableUploadTimeout="true" URIENCODING="UTF-8"/>

之前是没有uriencoding这个属性的,我给干掉,问题解决,这时候用的是默认值即ISO-8859-1。

关于server.xml的配置可以参考这个url的文档

http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html

问题解决的过程中,我特意研究了一下urlencode和urldecode这两个类,之所以没有用这种方案是因为我获得页面上的连接的时候用的是一个开源的叫做Cloud的类。

网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码; 2.将空格转换为加号 (+) ; 3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值; 4.在每个 name=value 对之间放置 & 符号。

编码过程非常简单,任何字符只要不是ASCII码数字,字母,或者前面提到的标点符,它们都将被转换成字节形式,每个字节都写成这种形式:一个“%”后面跟着两位16进制的数值。空格是一个特殊情况,因为它们太平常了。它除了被编码成“%20”以外,还能编码为一个“+”。加号(+)本身被编码为%2B。当/ # = & 和?作为名字的一部分来使用时,而不是作为URL部分之间的分隔符来使用时,它们都应该被编码。

类URL并不自动执行编码或解码工作。你能生成一个URL对象,它可以包括非法的ASCII和非ASCII字符和/或%xx。当用方法getPath() 和toExternalForm( ) 作为输出方法时,这种字符和转移符不会自动编码或解码。你应对被用来生成一个URL对象的字符串对象负责,确保所有字符都会被恰当地编码。

URLencode这个类负责把String编码成平台上的通用形式,urldecode类可以把url转换成string格式。

下面是urlencode的demo:

[java] view plain copy

  1. public static void main(String[] args) {
  2. try {
  3. System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));
  4. System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));
  5. System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));
  6. System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));
  7. System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));
  8. System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));
  9. System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));
  10. System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));
  11. System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));
  12. System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));
  13. System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));
  14. System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));
  15. System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));
  16. System.out.println(URLEncoder.encode("this中华人民共和国","UTF-8"));
  17. } catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");
  18. }
  19. }

执行结果如下:

[java] view plain copy

  1. This+string+has+spaces
  2. This*string*has*asterisks
  3. This%25string%25has%25percent%25signs
  4. This%2Bstring%2Bhas%2Bpluses
  5. This%2Fstring%2Fhas%2Fslashes
  6. This%22string%22has%22quote%22marks
  7. This%3Astring%3Ahas%3Acolons
  8. This%7Estring%7Ehas%7Etildes
  9. This%28string%29has%28parentheses%29
  10. This.string.has.periods
  11. This%3Dstring%3Dhas%3Dequals%3Dsigns
  12. This%26string%26has%26ersands
  13. This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters
  14. this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD

很明显url中有/%&=这类字符也会被编码,对于我们来说是不对的。例如

[java] view plain copy

  1. public static void main(String[] args) {
  2. try {
  3. System.out.println(URLEncoder.encode("pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3","UTF-8"));
  4. } catch (UnsupportedEncodingException e) {
  5. e.printStackTrace();
  6. }
  7. }

这个结果就是不对的了,会有如下输出:

pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

所以这种情形我们要对每一部分做分段encode

[java] view plain copy

  1. pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

对于urldecoder类来说

它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符

直接上demo:

[java] view plain copy

  1. public static void main(String[] args) {
  2. String input = "http://www.altavista.com/cgi-bin/" + "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";
  3. String output;
  4. try {
  5. output = URLDecoder.decode(input, "UTF-8");
  6. System.out.println(output);
  7. } catch (UnsupportedEncodingException e) {
  8. e.printStackTrace();
  9. }
  10. }

输入的结果如下:

[html] view plain copy

  1. http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+"Java I/O"&search.x=38&search.y=3

更多的可以参考这个文章:

http://www.java3z.com/cwbwebhome/article/article2/2414.html

总结一下,今天发生的中文乱码的问题最终的解决方案可能和urlencode和urldecode没有多大关系,这里有时间还要熟悉一下jboss的server.xml的配置文件。urlencode主要有encode方法,用来把url中非数字和字母的字符转换成%加两位16进制。urldecode主要有decode方法,用来把一个含有%加两位16进制的url转换成正常的编码。

输入的结果如下:

[html] view plain copy

  1. http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+"Java I/O"&search.x=38&search.y=3

更多的可以参考这个文章:

http://www.java3z.com/cwbwebhome/article/article2/2414.html

总结一下,今天发生的中文乱码的问题最终的解决方案可能和urlencode和urldecode没有多大关系,这里有时间还要熟悉一下jboss的server.xml的配置文件。urlencode主要有encode方法,用来把url中非数字和字母的字符转换成%加两位16进制。urldecode主要有decode方法,用来把一个含有%加两位16进制的url转换成正常的编码。

时间: 2024-08-10 02:06:13

jsp页面中文解决办法的相关文章

如何彻底解决jsp页面中文乱码及数据库乱码

最近自己闲做一个小项目,搭建环境框架SSH+MySQL数据库,遇到一个问题:jsp页面中文显示乱码,数据库插入数据和更新数据时中文也显示乱码,后来在网上找了许多解决方法,还是折腾了两天才把问题解决,下面总结一下彻底解决中文乱码问题: 在项目里的我统一使用UTF-8的编码方式 1.知道自己安装Mysql数据库安装配置时选择了什么编码方式,如果之前安装,现在不太清楚,建议重新安装Mysql数据库,安装配置时选择utf8 (这里有个小技巧:不用卸载Mysql数据,找到安装Mysql数据库目录:D:\M

Sitemesh排除Exclude不装饰特定页面的解决办法

有时候项目中有些文件不需要Sitemesh装饰,例如Error.htm, Error.jsp, OnlineHelp.htm等等.但是用Sitemesh的Exclude不管用,用Printable也不管用: 因为Sitemesh装饰的排除路径是虚拟路径而非实际路径.Sitemesh是根据URL来进行装饰Decoration的.最后的解决办法是:如果我们不想让Sitemesh对OnlineHelp.htm进行装饰,那就在这个文件的头加上这个: 然后在decorators.xml里面配置一下: 最后

Snap Build Your Own Blocks输入中文解决办法

Snap Build Your Own Blocks输入中文解决办法 Snap! (formerly BYOB) is a visual, drag-and-drop programming language. It is an extended reimplementation of Scratch (a project of the Lifelong Kindergarten Group at the MIT Media Lab) that allows you to Build Your

powerpoint无法输入中文怎么办|ppt文本框无法输入中文解决办法

powerpoint文本框无法输入中文的情况不知大家是否遇到过呢?反正小编是遇到过这样的情况的,简直是急煞人也!那么powerpoint无法输入中文时应该怎么办呢?本节内容中小编就为大家带来ppt文本框无法输入中文问题解决办法,下面不妨一起来了解一下吧! ppt文本框无法输入中文解决办法 用最原始的办法注册表监视变化情况来安装一个新的OFFICE可以解决,但随之找到另一方法就是比较排除法,比较另一台电脑关于输入法的注册表键值从而找出他们的不同处.所以这里提供2种方法: 1. 重装MS OFFIC

Zabbix 2.2.4 无法显示中文解决办法

安装了zabbix2.2.4 在web界面profile中选择语言的时候没有中文zh_CN,并不是2.2.4版本不支持中文而是在zabbix/locales.inc.php中没有开启中文选项显示. 修改locales.inc.php将中文开启: [[email protected] ~]# vim /var/www/html/zabbix2.2.4/include/locales.inc.php 刷新zabbix web界面,查看语言选项: Zabbix 2.2.4 无法显示中文解决办法

解决JSP页面中文乱码插入到数据库的问题

在JSP页面使用表单注册一个用户名的时候,查看到数据库里面的表中文显示乱码的情况有两种: 1.JSP页面传进来的参数中文就是乱码,则是前台的问题,这个时候写一个过滤器就好了,可以写如下的一个过滤器 public class EncodingFilter implements Filter { String encoding; private static final String DEFAULT_CHARACTER_ENCODING = "UTF-8"; public Encoding

分享url带中文参数,打开html操作完毕跳转jsp页面中文乱码解决

1.在app端分享参数组合时不对传递的url进行任何编码. 2.打开html页面时使用 escape函数对有中文的参数进行编码 escape(GetQueryString("parameter")); 3.操作完毕跳转.jsp页面时,需要使用jsp解码,不能使用javascript函数进行解码否则 乱码 <%@page import="java.net.URLDecoder" %> androidLoadStoreUrlResterAlert=URLDe

MyEclipse JSP页面中文字符不能保存

问题: 就是写HTML+JSP代码时有些中文,保存时提示sava could not be completed. Reason: some characters cannot be mapped using "ISO-8859-1" character encoding. Either change the encoding or remove the characters which are not supported by the "ISO-8859-1" ch

spring 框架java后台获取的中文解决办法

首先,jsp页面的编码必须是一致的,我这里是有的UTF-8,如: <%@page  contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 接着,可以使用spring 的CharacterEncod