当前位置: 代码迷 >> JavaScript >> jsp读书笔记2――jsp编码有关问题
  详细解决方案

jsp读书笔记2――jsp编码有关问题

热度:117   发布时间:2012-11-01 11:11:31.0
jsp读书笔记2――jsp编码问题

今天在编写一个关于用不同的方式来设置form表单实验时发现了一个挺头痛的问题。程序如下:

第一种情况

<form name=form1 method="post">

?? user:<input type=text name=user1 ><br>

?? <input type=submit value=register>

</form>

?

第二种情况

<form name=form2 method="post">

?? user:<input type=text name=user2 value=<%= request.getParameter("user2") %>><br>

?? <input type=submit value=register>

</form>

?

第三种情况

<form name=form3 method="post">

?? user:<input type=text name=user3 value=${param.user3}><br>

?? <input type=submit value=register>

</form>

?

(1)???? 由于在jsp页面中直接写入中文,并且没有使用page指令设置页面的编码方式,于是在用浏览器访问时出现异常。

(2)???? 后来无意间在整个程序的最前面插入了一个空行,程序运行居然没问题了,用浏览器访问显示出了正常的内容。为什么加入了个回车换行程序就正常运行呢,不解,于是查看了一下有jsp程序生成的Servlet源程序。发现其实程序并不算完全没问题,因为在生成的Servlet源程序中jsp页面中的中文显示为乱码(浏览显示时正常)如下为生成的Servlet源程序中的一部分:

out.write("\r\n");

out.write("μúò????é??\r\n");

out.write("<form name=form1 method=\"post\">\r\n");

out.write("\tuser:<input type=text name=user1 ><br>\r\n");

out.write("\t<input type=submit value=register>\r\n");

out.write("</form>\r\n");

out.write("\r\n");

out.write("μú?t???é??\r\n");

out.write("<form name=form2 method=\"post\">\r\n");

out.write("\tuser:<input type=text name=user2 value=");

????? out.print( request.getParameter("user2") );

out.write("><br>\r\n");

out.write("\t<input type=submit value=register>\r\n");

out.write("</form>\r\n");

??? out.write("\r\n");

out.write("μúèy???é??\r\n");

out.write("<form name=form3 method=\"post\">\r\n");

out.write("\tuser:<input type=text name=user3 value=");

out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${param.user3}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));

out.write("><br>\r\n");

out.write("\t<input type=submit value=register>\r\n");

out.write("</form>\r\n");

? ? ? 于是猜测之前的程序异常是编码方面的问题,于是在程序的开头 ? ? ? ? ?出加入如下语句:

? ? ? ?<%@ page pageEncoding="gb2312" %>

? ? ? ?果然,程序又运行正常了。查看有jsp页面生成的Servlet源程 ? ? ? ? 序,之前的乱码也显示正常了。

(3)???? 尽管程序运行正常了,但之前的问题还没解决,在没使用page指令的情况下,为什么在程序开头处加入个空行就能在浏览器显示出正常的结果(尽管Servlet源程序中的中文部分是乱码),而不加空行就出现异常。查阅了相关资料发现,jsp引擎必须在读到page指令后才能知道jsp源文件的字符集编码,在读取到这些page指令之前,jsp引擎是无法知道jsp源文件的字符集编码。由于英文ASCII码字符在UTF-8编码和各个国家的本地字符集编码中的值完全一样,所以jsp引擎总是先按UTF-8编码方式来读取jsp源文件的内容,这就要求设置page指令的contentType属性和pageEncoding属性的语句之前不能有非UTF-8编码的字符。原来如此,由于我的程序开始是中文,系统默认情况下是gb2312字符集编码,所以没插入一个空行时就出现了异常。当插入一个空行之后,jsp不再是以中文开头,所以用UTF-8的编码方式将jsp源程序转换成Servlet源程序就没出现异常,但其中的中文部分在Servlet源程序中还是乱码。如果确实是以上分析编码原因的话,那么把jsp源文件以UTF-8方式编码,那么即使不适用page指令而且jsp源程序以中文开头,那么程序也应该不会出现问题,于是将jsp源程序另存为以UTF-8编码,用浏览器访问,果然没问题,而且生成的Servlet源程序中的中文也没出现乱码。

(4)???? 最后剩下的问题就是在jsp源程序插入一个空行后,生成的Servlet源程序中的中文是乱码,而用浏览器访问时却是正常显示,这又是为什么呢。本人猜测,由于一开始jsp源文件是以gb2312的编码方式保存,而在生成Servlet源程序时是使用UTF-8编码(错误的编码方式),于是出现乱码,而后来浏览器显示又再次以错误的编码方式编码,于是错错得对,浏览器显示出了正常的内容。(不知道这想法对不,麻烦有经验的人如果看到这篇文章解答下)