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