解决JSP中的各种乱码问题

    JSP乱码有几种情况:页面乱码、参数乱码、表单乱码、源文件乱码。下面逐一解决这些乱码问题:

一、JSP页面中文乱码
    在JSP页面中,中文显示乱码有两种情况:一种是在HTML中的中文乱码,另一种是在JSP动态输出的中文乱码。
    先看一个JSP程序,包含了上述两种情况:

<%@ page language="java" import="java.util.*" %>
<html>
    <head>
    <title>中文显示示例</title>
    </head>

    <body>
    这是一个中文显示示例:
    <%
         String str="中文字符串";
         out.print(str);
    %>
    </body>
</html>

运行后在浏览器的显示如下:

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

<%@ page language="java" import="java.util.*" contentType="text/html;charset=GB2312" %>

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

二、URL传递参数中文乱码
    一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。
     下面是一个示例程序:

<%@ page language="java" import="java.util.*" contentType="text/html;charset=GB2312" %>
<html>
    <head>
        <title>URL传递参数中文处理示例</title>
    </head>
    <%
        String param=request.getParameter("param");
    %>
    <body>
        <a href="URLcharset.jsp?param='中文'">请点击这个链接</a><br>
        你提交的参数为<%= param %>
    </body>
</html>

     其中,URLcharset.jsp是你的JSP文件的名称。当你点击链接后,通过此条URL,即URLcharset.jsp?param=’中文’,向程序传递参数param的值,它是一个中文的字符串。运行结果如下:

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

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="gb2312"    connectionTimeout="20000" redirectPort="8443"/>

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

三、表单提交中文乱码
对于表单中的数据可以使用reuqest.getParameter(“”)的方法获取,但是当表单中出现中文数据的时候就会出现乱码。示例代码如下:

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312">
<html>
    <head>
        <title>Form中文处理</title>
    </head>
    <body>
        <font size="2">
            下面是表单内容:
            <form action="AcceptFormCharset.jsp" method="post">
            用户名:<input type="text" name="username" size="10"/>
            密  码:<input type="password" name="password" size="10"/>
            <input type="submit" value="提交">
            </form>
    </body>
</html>

     在上面的表单当中向AcceptFormCharset.jsp页面提交两项数据,下面是AcceptFormCharset.jsp的内容:

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>  
<html>  
    <head>  
        <title>Form中文乱码</title>  
    </head>  
    <body>  
        <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>  
            <%  
                String username = request.getParameter("username");  
                String password = request.getParameter("password");  
                out.println("表单输入username的值:" + username + "<br>");  
                out.println("表单输入password的值:" + password + "<br>");  
             %>   
        </font>  
    </body>  
</html>

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

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

<%@ page language="java" import="java.util.*"  
        contentType="text/html;charset=gb2312"%>  
    <html>  
        <head>  
            <title>Form中文乱码</title>  
        </head>  
        <body>  
            <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>  
                <%  
                    String username = request.getParameter("username");  
                    String password = request.getParameter("password");  
                    out.println("表单输入username的值:" + new String(username.getBytes("ISO-8859-1"),"gb2312") + "<br>");  
                    out.println("表单输入password的值:" + new String(password.getBytes("ISO-8859-1"),"gb2312") + "<br>");  
                 %>   
            </font>  
        </body>  
    </html> 

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

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

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

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

     另外,在Eclipse或者MyEclipse当中JSP文件默认的编码为ISO-8859-1,所以在JSP代码中间如果出现中文就不能保存,例如如下代码:

    <%@ page language="java" import="java.util.*" %>  
    <html>  
        <head>  
        <title>中文显示示例</title>  

        </head>   
        <body>  
        这是一个中文显示示例:  
        <%  
            String str = "中文";  
            out.print(str);  
        %>  
        </body>  
    </html>  

    修改后在保存时会提示如下:

     出现这个提示的原因在于JSP源文件中有ISO-8859-1编码无法识别的中文字符,对于这个问题,解决办法就是在页面中声明页面编码格式即可。声明后代码如下:

    <%@ page language="java" import="java.util.*"  pageEncoding="GB2312" %>  
    <html>  
        <head>  
        <title>中文显示示例</title>  

        </head>   
        <body>  
        这是一个中文显示示例:  
        <%  
            String str = "中文";  
            out.print(str);  
        %>  
        </body>  
    </html>  

    其中第一行中的pageEncoding=”gb2312”指明了JSP页面编码采用GB2312,这样就可以正常保存JSP的源文件了。

     乱码问题的原因就是程序(Eclipse也好,浏览器也罢)的编码没有和编程人员的编码进行统一,那么解决这个问题只需要将编程人员想要的编码告诉程序就可以了,以上解决乱码问题的种种方法都可以说是一种声明编码的过程,也就是说乱码问题的中解决方案就是:转码。这里的转码要么是编程人员手动转,要么就是让程序去转。

祝大家编程顺利!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值