zoukankan      html  css  js  c++  java
  • 格式编码jsp乱码分析及解决(1)

    本篇文章朋友在青岛吃饭的时候突然想到的...这段时间就有想写几篇关于格式编码的文章,所以回家到以后就奋笔疾书的写出来发布了

                想必大家在网站开辟时经常遇到乱码问题,近来自己在写了一个博客的小例子时,又遇到了乱码问题,一般都是些罕见的,往往搜搜,都有处理方案,但网上大部分都是直接贴处理方案的,没有指出具体原因,所以这两天自己看了一些关于乱码的文章,慢慢有点头绪,所以放松写下来,我会把自己遇到的乱码问题逐一呈现给大家,并分析原因及写出处理办法。

        

                 若有不对,还请大家多多包含,踊跃教正!一个人的懂得往往是无限,甚至有错误,群策群力才会使分析更趋于正确、完善!

        

        

        先看一段代码,解释几处代码:

    <%@ page language="java" pageEncoding="gb2312"%>
    
    <%@ page contentType="text/html;charset=iso8859-1"%>
    
    <html>
    
    <head>
    
    <title>JSP的中文处理</title>
    
    <meta http-equiv="Content-Type" content="text/html charset=gb2312">
    
    </head>
    
    <body>
    
    <%out.print("JSP的中文处理");%>
    
    </body>
    
    </html>

        第一处<%@ page language="java" pageEncoding="gb2312"%>,指定了页面的编码格式,jsp文件的存储格式就是这个编码格式,Eclipse会根据这个编码格式保存文件。并编译jsp文件,包括里面的汉字。

        
    第二处编码为解码格式。因为存为gb2312的文件被解码为iso8859-1,这样若有中文肯定出乱码。也就是必须分歧。如果第二处所在的这一行没有的话,系统默认也是应用iso8859-1的编码格式。所以如果没有这一行的话,也会出现乱码。必须分歧才可以。

        这行担任jsp页面中字符按什么编码格式表现,也就是最终见到的网页内容的编码格式。

        注意:<%@ page language="java" pageEncoding=""%>指定了,<%@ page contentType="text/html;charset="%>没有指定的话,一般默认是iso8859-1编码格式;反之,它们编码格式雷同。

        

     第三处编码为控制浏览器的解码方法。如果后面的解码都分歧并且无误的话,这个编码格式用不用设置都可以。有的网页出现乱码,就是因为浏览器不能肯定应用哪种编码格式。因为页面有时候会嵌入页面,致使浏览器混淆了编码格式出现了乱码。

        注意:<%@ page contentType="text/html;charset="%>指定了浏览器的编码格式,如果jsp页面中指定了这个,那么meta http-equiv="Content-Type" content="text/html charset=">是不起作用的;只有jsp中没有<%@ page contentType="text/html;charset="%>,它才会起作用;如果它们都存在,<%@ page contentType="text/html;charset="%>优先。

        

        

        下面开始进入正文:

        

        情形1:

                     jsp页面利用form表单提交(method=“post”),在servlet文件中利用request.getParameter("参数名")失掉传过来的值。这里往往会出现乱码。

        

        

        

        接下来的例子的处理方法是正确的,大家注意看红色字

        

        症结点:jsp中的charset=“utf-8”且value = new String(value.getBytes("ISO8859_1"), "utf-8");这两个地方字符要保持分歧才行。

        

        index.jsp

        

    <%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>

        <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title></title> <link href="CSS/style.css" type="text/css" rel="stylesheet"> <style type="text/css"></style> </head> <body onselectstart="return false"> <table class="indexmain"> <tr> <td valign="top"><table width="658" border="0"> <tr> <td colspan="2"> </td> </tr> <tr> <td width="92" height="358"> </td> <td width="550" valign="bottom"> <

        form name="form1" method="post" action="ConsumerServlet?method=0&sign=0" onSubmit="return userCheck()

        "> <table width="291" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td width="66" height="30">用户名:</td> <td width="225"> <input name="account" type="text" class="inputinput"

        id="account"

        size="30"> </td> </tr> <tr> <td height="30">密  码:</td> <td><input name="password" type="password" class="inputinput" id="password" size="30"></td> </tr> <tr> <td height="30" colspan="2" align="center"> <input type="image" class="inputinputinput" src="images/land.gif">    <a href="#" onClick="javascript:form1.reset()"><img src="images/reset.gif"></a>    <a href="accountAdd.jsp"><img src="images/register.gif"></a> </td> </tr> </table> </form> </td> </tr> </table> </td> </tr> </table> <script src="JS/validate.js" language="javascript" type="text/javascript"></script> </body> </html>

        

        ConsumerServlet.java

        

        

    // 用户登录操纵
    	public void checkConsumer(HttpServletRequest request,HttpServletResponse response)
    			                                                         throws ServletException, IOException {

        String account = Chinese.toChinese(request.getParameter("account"));

        consumerDao = new ConsumerDao(); ConsumerForm consumerForm = consumerDao.getConsumerForm(account); if (consumerForm == null) { request.setAttribute("information", "您输入的用户名不存在,请从新输入!"); } else if (!consumerForm.getPassword().equals( request.getParameter("password"))) { request.setAttribute("information", "您输入的登录密码有误,请从新输入!"); } else { request.setAttribute("form", consumerForm); } //验证通过以后 RequestDispatcher requestDispatcher = request.getRequestDispatcher("dealwith.jsp"); requestDispatcher.forward(request, response); }

        Chinese.java(症结)

                      

        每日一道理
    生活的无奈,有时并不源于自我,别人无心的筑就,那是一种阴差阳错。生活本就是矛盾的,白天与黑夜间的距离,春夏秋冬之间的轮回,于是有了挑剔的喜爱,让无奈加上了喜悦的等待。
    public class Chinese {
        public  static String  toChinese(String value) {
               try {
                   if (value == null) {
                       return "";
                   } else {

        value = new String(value.getBytes("ISO8859_1"), "utf-8");

        return value; } //用ISO8859_1的编码格式去读取value,并转换成utf-8 } catch (Exception e) { return ""; } } }

        

        这段代码担任转码,可能大家对红色代码不太懂得,我这里贴上JAVA API的解释:

        

        public byte[] getBytes(String charsetName)

                   throws UnsupportedEncodingException

        应用指定的字符集将此String 解码为字节序列,并将结果存储到一个新的字节数组中。

        当此字符串不能在给定的字符会合解码时,该方法无指定的行为。当需要进一步控制解码过程时,应应用CharsetEncoder 类。

        参数:

        charsetName - 受支持的 charset 名称

        返回:

        结果字节数组

        抛出:

        UnsupportedEncodingException - 如果指定的字符集不受支持

        

        public String(byte[] bytes,

                  String charsetName)

           throws UnsupportedEncodingException

        构造一个新的 String,方法是应用指定的字符集解码指定的字节数组。新的 String 的长度是一个字符集函数,因此不能等于字节数组的长度。

        当给定字节在给定字符会合无效的情况下,该构造方法无指定的行为。当需要进一步控制解码过程时,应应用 CharsetDecoder 类。

        参数:

        bytes - 要解码为字符的字节

        charsetName - 受支持的 charset 的名称

        抛出:

        UnsupportedEncodingException - 如果指定字符集不受支持

        

        

        

        情形2:

              form表单的另外一种形式(利用Submit)。

        

        

        下面是一个提交页面(submit.jsp),代码如下:

    <%@ page contentType="text/html; charset=gb2312"%>
    
     <html>
    
    <head><title>JSP的中文处理</title>
    
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    
    </head>
    
    <body>
    
    <form name="form1" method="post/get" action="process.jsp">
    
    <div align="center">
    
    <input type="text" name="name">
    
    <input type="submit" name="Submit" value="Submit">
    
    </div>
    
    </form>
    
    </body>
    
    </html>

        下面是处理页面

        (process.jsp)

        代码:

        

        

    <%@ page contentType="text/html; charset=gb2312"%>
    
    <html>
    
    <head>
    
    <title>JSP的中文处理</title>
    
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    
    </head>
    
    <body>
    
    <%=request.getParameter("name")%>
    
    </body>
    
    </html>

        如果输入中文,就会看到乱码,处理方法同上:

        

        

    <%@ page contentType="text/html; charset=gb2312"%>
    
    <html>
    
    <head>
    
    <title>JSP的中文处理</title>
    
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    
    </head>
    
    <body>
    
    <%
    
    String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;
    
    out.print(s);
    
    %>
    
    </body>
    
    </html>

        这样就OK了。

        

        

        

        分析:

                tomcat默认应用ISO-8859-1的方法去读取数值的,但实际里面的字符编码应该是jsp页面的pageEncoding指定的(一般不会是iso-8859-1),这样的话读取以后表现的编码格式和存储的格式不分歧,所以出现了乱码。

        

                而我们的转码恰恰处理了这个问题,我们先应用ISO-8859-1格式解码字符串,再利用与pageEncoding分歧的编码格式解码字节数组,这样就使读取以后表现的编码格式和存储的格式分歧,乱码问题处理。

        

        

        

        

        网上搜索的来另外一种处理方案:

        

                                             通过request.seCharacterEncoding ("gb2312")对请求进行同一编码。

        

        修改后的process.jsp代码如下:

        

    <%@ page contentType="text/html; charset=gb2312"%>
    
    <%request.setCharacterEncoding("gb2312");%>
    
    <html>
    
    <head>
    
    <title>JSP的中文处理</title>
    
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    
    </head>
    
    <body>
    
    <%=request.getParameter("name")%>
    
    </body>
    
    </html>

        

        经测试,这个方法不行,还是乱码,哪位给解释解释????

        

        

        

        

        

        

        未完待续~~~

        

                       

                   

        

        

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: 这年头的互联网真是娱乐了中国,网民们从各种各样的“门”里钻来钻去,又有好多“哥”好多“帝”,值得大家品味不已……网络经典语录,关于IT与互联网,经典与您分享!

    --------------------------------- 原创文章 By
    格式和编码
    ---------------------------------

  • 相关阅读:
    GDI+常用操作、入门解析
    实用SQL语句大全
    SQL语句全解析
    ASP.NET MVC 浅析
    C#版文件分割器
    转一个orbitpanel GIS
    怎么给listbox 的item 添加动画1? GIS
    怎么给listbox 的item 添加动画? GIS
    关于查找可视树的一点问题 GIS
    判断gridview 滑动到最右端 GIS
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3106629.html
Copyright © 2011-2022 走看看