zoukankan      html  css  js  c++  java
  • jsp页面中文乱码解决方案

    一、JSP页面中文乱码

    JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。

    先看一个JSP程序:

    1. <%@ page language="java" import="java.util.*"  %>  
    2. <html>  
    3.     <head>  
    4.     <title>中文显示示例</title>  
    5.   
    6.     </head>   
    7.     <body>  
    8.     这是一个中文显示示例:  
    9.     <%  
    10.         String str = "中文";  
    11.         out.print(str);  
    12.     %>  
    13.     </body>  
    14. </html>  

    上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。运行后在浏览器中显示如图所示

    原因在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代码中page命令修改成如下所示即可

     

    1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" %>  
    2. <html>  
    3.     <head>  
    4.     <title>中文显示示例</title>  
    5.   
    6.     </head>   
    7.     <body>  
    8.     这是一个中文显示示例:  
    9.     <%  
    10.         String str = "中文";  
    11.         out.print(str);  
    12.     %>  
    13.     </body>  
    14. </html>  

    再次运行乱码消失,原理就是向页面指定编码为UTF-8,那么页面就会按照此编码来显示,于是乱码消失。

    二、URL传递参数中文乱码

    一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。

    下面是一个示例程序

    1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8"%>  
    2. <html>  
    3.     <head>   
    4.         <title>URL传递参数中文处理示例</title>  
    5.     </head>  
    6.     <%  
    7.         String param = request.getParameter("param");  
    8.     %>  
    9.     <body>  
    10.         <a href="URLCharset.jsp?param='中文'">请点击这个链接</a><br>  
    11.         你提交的参数为:<%=param%>  
    12.     </body>  
    13. </html>  

    上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果如下图

    对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcatconf目录下的server.xml配置文件,具体改后的代码如下

    1. <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"  
    2.                connectionTimeout="20000"    
    3.                redirectPort="8443" />  

    在原来代码中添加URI编码设置URIEncoding=“UTF-8”即可,重启Tomcat服务器可以得到正确的页面。其原理也和上面的情况类似,就是向程序指明编码类型,然后显示就正常了。

    三、表单提交中文乱码

    对于表单的数据可以使用request.getParameter(“”)的方法获取,但是当表单中出现中文数据的时候就会出现乱码。

    示例代码如下

    1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8"%>  
    2. <html>  
    3.     <head>     
    4.         <title>Form中文处理示例</title>  
    5.     </head>   
    6.     <body>  
    7.         <font size="2">  
    8.                 下面是表单内容:  
    9.             <form action="AcceptFormCharset.jsp" method="post">  
    10.                 用户名:<input type="text" name="userName" size="10"/>  
    11.                 密  码:<input type="password" name="password" size="10"/>  
    12.                 <input type="submit" value="提交">  
    13.             </form>    
    14.         </font>  
    15.     </body>  
    16. </html>  

    在上面的表单当中想AcceptFormCharset这个页面提价两项数据,下面是AcceptFormCharset.jsp的内容:

    1. <%@ page language="java" import="java.util.*"  
    2.     contentType="text/html;charset=UTF-8"%>  
    3. <html>  
    4.     <head>  
    5.         <title>Form中文乱码</title>  
    6.     </head>  
    7.     <body>  
    8.         <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>  
    9.             <%  
    10.                 String userName = request.getParameter("userName");  
    11.                 String password = request.getParameter("password");  
    12.                 out.println("表单输入userName的值:" + userName + "<br>");  
    13.                 out.println("表单输入password的值:" + password + "<br>");  
    14.              %>   
    15.         </font>  
    16.     </body>  
    17. </html>  

    在上面的程序中,如果表单输入没有中文,则可以正常的显示当输入的数据中有中文的时候,得到的结果如图所示。

    产生种结果的原因是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。对于这个问题可以采用转换编码格式的方法来解决,现在对AcceptFromCharset这个页面改动如下:

    1. <%@ page language="java" import="java.util.*"  
    2.     contentType="text/html;charset=gb2312"%>  
    3. <html>  
    4.     <head>  
    5.         <title>Form中文乱码</title>  
    6.     </head>  
    7.     <body>  
    8.         <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>  
    9.             <%  
    10.                 String userName = request.getParameter("userName");  
    11.                 String password = request.getParameter("password");  
    12.                 out.println("表单输入userName的值:" + new String(userName.getBytes("ISO-8859-1"), "UTF-8")+ "<br>");  
    13.                 out.println("表单输入password的值:" + new String(password.getBytes("ISO-8859-1"), "UTF-8")+ "<br>");  
    14.              %>   
    15.         </font>  
    16.     </body>  
    17. </html>  

    经过这样的转换编码以后,所有的中文输入都可以用request对象正常取出。在上面这个程序中,第四行和第五行是转换编码格式的关键,先从ISO-8859-1格式的字符串中取出字节内容,然后在用UTF-8的编码格式重新构造一个新的字符串。这样就可以支持中文变淡输入的正常取值和显示。改进以后程序运行结果如下

    经过上面的更改编码格式的处理,表单的中文输入乱码问题已经得到解决。但是如果上面的表单中的输入项不止是两个,那么每个输入项都需要进行编码转换,那样就很麻烦了。这是我们就用到过滤器filter了。下面简单介绍一下。

    package com.foxmail.xxy668;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class SetCharacterEncodingFilter implements Filter{
    
    	protected FilterConfig filterConfig;
    	protected String encodingName;
    	protected boolean enable;
    
    	@Override
    	public void destroy() {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public SetCharacterEncodingFilter() {
    		this.encodingName="UTF-8";
    		this.enable=false;
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain chain) throws IOException, ServletException {
    		if(this.enable){
    			request.setCharacterEncoding(this.encodingName);
    		}
    		chain.doFilter(request,response);
    	}
    
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    		this.filterConfig=filterConfig;
    		loadConfigParams();
    	}
    
    	private void loadConfigParams(){
    		this.encodingName=this.filterConfig.getInitParameter("encoding");
    		String strIgnoreFlag=this.filterConfig.getInitParameter("enable");
    		if(strIgnoreFlag.equalsIgnoreCase("true")){
    			this.enable=true;
    		}else{
    			this.enable=false;
    		}
    	}
    }
    在上面的这个过滤器中,init方法从配置文件中取出字符编码格式的参数,在doFilter方法中使用request对象对所有的请求统一编码格式。


    四、EclipseJSP文件中文乱码

    Eclipse或者MyEclipse中由于默认的JSP编码格式为ISO-8859-1,所以当打开由其他编辑器编辑的JSP文件时会出现乱码,如图所示

    对于这个问题我们只需要更改一下Eclipse或者是MyEclipse中对JSP的默认编码就可以了,修改的地方(我的MyEclipse版本为11)如图所示


  • 相关阅读:
    有道云笔记隐藏ad控件
    commons-httpclient直接发送内存中byte[]文件
    springboot打包成zip部署,并实现优雅停机
    Java读取相对路径文件时,报FileNotFoundException异常
    Oracle 添加 scott 示例用户
    Usage and Idioms——Exception testing
    Usage and Idioms——Test execution order
    Usage and Idioms——Aggregating tests in suites
    Usage and Idioms——Test runners
    Usage and Idioms——Assertions
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653275.html
Copyright © 2011-2022 走看看