【Web后端笔记】jsp传递中文数据出现乱码的问题

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_



 
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。