JSP文件中乱码现象经常遇到,那如何处理就是我们不可避免的话题,那么该如何解决呢,下面我针对不同的情况,给出几种处理方式:
1) JSP页面中文乱码,这种情况比较好处理,在页面的page指令中加上如下一项就行
<%@ page contentType=”text/html;charset=UTF-8” %>
2) JSP页面采用表单提交时,提交的数据中包含中文,并且提交方式为post这时我们获取表单数据后,展示到其它页面时会出现乱码,解决方案是在获取请求中的参数前,先设置请求的字符集。
1 request.setCharacterEncoding(“UTF-8”) ;
3) 还是表单提交数据,但是提交方式为默认的get方式,这时即使我们设置了请求字符集,但取出来还是乱码,这时需要如下的转换方式,我把转换方式用一个编码转换类来实现了。
1 /*
2 * 定义一个转换字符集的工具类CharSetTool
3 *
4 * 定义一个方法,用来转换
5 */
6 public class CharSetTool
7 {
8 /*
9 * 方法toUTF8()
10 * 参数: @inStr 传入要转换的字符串
11 */
12 public static String toUTF8(String inStr)
13 {
14 String rtStr="";
15 if(inStr!=null)
16 {
17 try
18 {
19 rtStr=new String(inStr.getBytes("ISO-8859-1"),"UTF-8");
20 }
21 catch (UnsupportedEncodingException e)
22 {
23 //打印错误信息
24 System.out.println(e.getMessage());
25 }
26 }
27 return rtStr;
28 }
29 }
4) URL中文参数乱码处理,
比如:超链接方式
1 <% String str="我是中国人"; %>
2 <a href="next?str=<%=str%>">我是链接,单击可以提交参数</a>
注:next 为 Servlet的URL Pattern
那在将中文作为参数值传递时,首先要把中文字符串进行编码转换,转换成URL格式
操作如下:
1 <% String str="我是中国人";
2 //使用URLEncoder.encode方法
3 str = URLEncoder.encode(str,"UTF-8");
4 %>
5 <a href="next?str=<%=str%>">我是链接,单击可以提交参数</a>
综合以上几种比较常见的JSP中文乱码的处理方式,不管是何种提交方式,我们都可以使用JSP中的过滤器(Filter)来过滤字符编码,下面我就给出一个我自己定义的 “通用”的字集编码过滤器。
1 /**
2 * 处理中文字符集的过滤器
3 *
4 * @author Administrator
5 *
6 */
7 public class EncodingFilter implements Filter
8 {
9 //过滤器销毁的方法
10 public void destroy()
11 {
12 }
13
14 public void doFilter(ServletRequest request, ServletResponse response,FilterChain chan)
15 throws IOException, ServletException
16 {
17
18 //设置响应模式
19 response.setContentType("text/html;charset=UTF-8");
20
21 //判断客户端的提交方式
22 if(((HttpServletRequest)request).getMethod().equalsIgnoreCase("POST"))
23 {
24 //POST方式提交
25 //设置请求字符集
26 request.setCharacterEncoding("UTF-8");
27
28 }
29 else
30 {
31 //处理GET
32 //获取所有的提交参数
33 Enumeration names = request.getParameterNames();
34
35 //遍历
36 while(names.hasMoreElements())
37 {
38 //参数名
39 String name = (String)names.nextElement();
40
41 //因为不知道参数是多值还是单值
42 String values[] = request.getParameterValues(name);
43
44 //循环处理字符集转换
45 for(int i=0;i<values.length;i++)
46 {
47 values[i] = toUTF8(values[i]);
48 }
49 }
50 }
51 //调用过滤器链中的下一个过滤器
52 chan.doFilter(request, response);
53 }
54
55 //转换方法(内部私有方法)
56 private String toUTF8(String str)
57 {
58 String rt = null;
59
60 try {
61 if(str!=null)
62 {
63 //转换新字符集
64 rt = new String(str.getBytes("ISO-8859-1"),"UTF-8");
65
66 }
67 } catch (UnsupportedEncodingException e) {
68 // TODO 自动生成 catch 块
69 e.printStackTrace();
70 }
71
72 return rt;
73 }
74
75 //初始化方法
76 public void init(FilterConfig config) throws ServletException
77 {
78 }
79 }
然后在web.xml文件中进行相关的配置 :
1 <!-- 配置过滤器 -->
2 <filter>
3 <filter-name>EncodingFilter</filter-name>
4 <filter-class>ocean.mvc.filter.EncodingFilter</filter-class>
5 </filter>
6
7 <filter-mapping>
8 <filter-name>EncodingFilter</filter-name>
9 <url-pattern>/*</url-pattern> <!-- 匹配所有的请求 -->
10 </filter-mapping>
参考原文:http://zhidao.baidu.com/link?url=8S3bNfWgwzTSRGeC4eO2SbBgSJShV9r_wpUOlCVKNcn2ERb40A0g5AjSro3aaRaqStuysTa1OvzroMoN0-t81_