关于JSP form表单提交获取乱码问题

    首先拿出一个标准的jsp文件,了解其属性的一些设置和参数

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>

   参数解析:

                contentType:内容类型——用于告知浏览器是什么类型的文件,并且说明采用什么编码格式打开

                charset:包含在contentType中,用于设置采用什么编码格式打开

                language:采用什么语言

                pageEncoding:此jsp文件的编码格式

                PageEncoding的注意点:

                PageEncoding用于什么呢?——一个jsp文件编译后回经历一个过程:从.jsp格式变为.java格式,

                此过程就由Tomcat(web 容器) 操作,此时Tomacat采用什么编码格式获取.jsp文件中的内容呢—

                采用pageEncoding设置的编码格式;

               

                在上方的参数并不是默认创建就生成的,一般来说新建一个jsp格式的文件 charset和pageEncoding

                默认采用的编码是ISO8859-1,查资料可以知道此编码格式是不支持中文的,所以一般采用UTF-8或

                者是GBK,还有一个细节(猜测)就是,如果你设置了charset并且没有设置pageEncoding 那么pageEncoding

                会随着charset改变而不是默认的,反之也是;

               

                PageEncoding采用默认编码格式,charset采用UTF-8 出现乱码问题解析:

                假如你的jsp文件中含有中文字符,然后你的pageEncoding格式为默认(ISO8859-1),而ISO8859-1不支持

                中文,接着Tomcat根据pageEncoding的设置对你的jsp文件进行读取,显而易见中文部分解析成了乱码,接

                 着由Tomcat服务器发送给浏览器,浏览器根据charset的编码格式进行显示,明显乱码用UTF-8显示自然是乱

                 码。

            

                最后总的来说:你的jsp中有中文 那么pageEncoding一定不能是ISO8859-1,同样charset也不能是ISO8859-1,

                至于其他的可以任意设置,因为可能第三阶段会进行转码(待考察),最好二者是一样的,根据jsp编译的三个

                 步骤(摘要别处):

              (1)第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案“翻译”

                      成统 一的UTF-8 JAVA源码(即.java)

              (2)第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,

                      经过这个阶段的结果全部是UTF-8的encoding的java源码。 JAVAC用UTF-8的encoding读取java源码,

                      编译成UTF-8 encoding的 二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)

                      内表达的规范。

                (3)  第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的

                       结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效。

在jsp中<head></head>中包含如下代码,可以看到同样有相同的内容用于设置charset编码格式

 <meta  http-equiv="content-type" content="text/html;charset=UTF-8">

  经过测试可以发现,此代码在静态页面中是有效果的,但是在jsp中同时包含page和meta生效的只有page中的content

关于jsp中form表单提交,在跳转页面读取表单信息,出现乱码解决:

    form信息如下

<form action="show.jsp" method="post">
    <input type="text" name="name">
    <input type="submit" value="提交">
</form>

  获取代码如下:

<body>
    <%
	  String name=request.getParameter("name");
    %>
    姓名:<%=name %>
</body>

根据此代码运行,可以发现出现乱码,接着对name进行编码,可以看到显示正确,由此可以得出表单发送过来的值是

 ISO8859-1编码的,这与pageEncoding 和charset所设定的UTF-8不同,因此二者是无关的

<body>
<%
	String name=new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
%>
姓名:<%=name %>
</body>

接下来输出request的编码格式,看看是否是ISO8859-1编码

<body>
<%
	out.print(request.getCharacterEncoding());
	String name=new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
%>
姓名:<%=name %>
</body>

request.getCharacterEncoding()输出的是null,所以他默认采用的是ISO8859-1

其他的解决方案是

<body>
<%
	request.setCharacterEncoding("UTF-8");
	String name=request.getParameter("name");
%>
姓名:<%=name %>
</body>

其他还有设置form accept-charset 是与request编码方式是无关的,之后再加上

    

发布了73 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/daguniang123/article/details/90028652