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("µÚþÖÖÇé¿ö\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("µÚÈýÖÖÇé¿ö\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编码(错误的编码方式),于是出现乱码,而后来浏览器显示又再次以错误的编码方式编码,于是错错得对,浏览器显示出了正常的内容。(不知道这想法对不,麻烦有经验的人如果看到这篇文章解答下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值