时间:2022-10-14 03:37:52
摘要:在利用Servlet/JSP技术开发Java Web应用程序的时候经常会遇到乱码的问题,包括服务器端的提交,以及通过浏览器的表示等。本文首先分析了从JSP到浏览器的执行过程,给出了jsp本身表示时产生乱码的原因及对策,然后在此基础上针对JSP应用中出现的一些常见的乱码问题,并提出了一些对应的解决方案,希望给开发人员在编码时提供帮助。
关键词:JSP;乱码;WEB开发
中图分类号:TP3文献标识码:A文章编号:1007-9599 (2012) 06-0000-02
一、问题提出
基于jsp的项目开发中经常遇到乱码的问题,包括:jsp自身页面固定文字的在浏览器上表示时的乱码,从客户端通过浏览器提交到服务器端时的乱码,以及服务器端登陆到DB中的乱码等等。对于初学者来说,这是一件令人非常头疼的事,无从下手,本文通过分析jsp的执行原理,在此基础上给出了一些乱码问题的解决方案,供大家参考。
二、从JSP到浏览器的执行过程
从服务器端的jsp源文件如何执行到客户端的html文件的呢?其中涉及到编码相关的过程如下。
(1)以某种编码格式保存jsp文件,例如GBK。
(2)Jsp/Servlet引擎提供的jsp转换工具(JSPC),现根据JSP文件中的
$CATALINA_HOME\work\Catalina\localhost\Context名的下面。
实际上,生成的JSP中的内容是按照pageEncoding映射到unicode,并通过utf-8格式写到java文件中的。
(3)把临时文件编译成class文件。
(4)class文件执行时,先从class文件中用readUTF读出字符串,在内存中是unicode编码。
(5)根据pageEncoding,把unicode转化成字节流。
(6)把字节流输出到浏览器(ie等)中,并根据jsp中的
中的Jsp-charset设置浏览器的编码格式。是通过http的header部实现的。
另外,HTML中有个标签中也指定了charset,如果jsp中没有指定则以这个为准。浏览器按照此标签来辨认html内容的编码格式。
总结,从jsp源文件到客户端html的编码过程为:pageEncoding到unicode到utf-8到unicode到Jsp-charset,由于unicode和utf-8之间的相互转化抵消。因此乱码产生的原因基本上有以下两种:
(1)jsp中pageEncoding和Jsp-charset设置不一致。
(2)画面表示中存在jsp中定义的字符集(pageEncoding或者Jsp-charset)中以外的文字。
三、解决对策
针对以上分析,解决jsp本身表示时出现乱码的对策有两种。
(1)使jsp中pageEncoding和Jsp-charset设置。
(2)如果画面表示时有字符集以外的文字存在的话,修改jsp的字符集设置。使出现乱码的字符包含在设定的字符集内。例如:繁体字:試聽,在GB2312字符集范围外,这种场合,字符集就需要修改成UTF-8或big5都可以。
四、web系统中常见的乱码原因分析及对策
以jsp为例,一般的web系统的执行过程基本上包括以下步骤:
浏览器ServletDBServlet(jsp)浏览器
当出现编码首先要判断哪个过程出现了乱码,可以通过debug和输出log的方式来判断。
下面按照每个阶段分析各阶段出现的乱码问题。
(1)在浏览器Servlet出现乱码的时候,即从客户端向服务器端提交时出现了乱码,这种情况按照提交方式的不同,需要分为两类。
1-1 get方式提交,例如:http://XXX/search/offer_search.do?keywords=中国
乱码的原因是tomcat的内部编码格式iso8859-1导致。Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,导致接受页面得到的参数为乱码。因此,它的处理方式仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码如下:
maxHttpHeaderSize="8192"maxThreads="150"minSpareThreads="25"maxSpareThreads="75" connectionTimeout="20000"redirectPort="8443" />
这里的URIEncoding要设置成和jsp中的content-type的charset一致。
或者手动通过URLEncoding.encode将内容转化成URL编码
1-2 post方式提交,乱码的原因也是tomcat的内部编码格式iso8859-1导致。作为对策一般是通过调用request的setCharacterEncoding方法来解决。通常可以通过Filter来实现。
第一步,需要定义filter类。自定义的filter一般继承javax.servlet.Filter。具体代码如下:
public class MyEncodingFilter implements Filter {
private String charEncoding=null;
private FilterConfig filterConfig=null;
public CharEncondingFilter() {}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
this.charEncoding=filterConfig.getInitParameter("charEncoding");
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(charEncoding);
chain.doFilter(req, res);
}
public void destroy() {
this.charEncoding=null;
this.filterConfig=null;
}
}
其中,chain.doFilter表示继续执行后面的处理。
第二步,在 Web 应用的 web.xml 中指明filter的名称。相关配置如下:
MyEncodingFilter
lhj.base.filter. MyEncodingFilter
charEncoding
gb2312
MyEncodingFilter
/*.do
其中,filter标签部分定义使用的过滤器,filter-mapping标签告诉服务器把哪些请求交给过滤器处理,这里/.do。表示根目录下的以.do结尾的请求都会被MyEncodingFilter拦截,并在请求处理设置上指定GB2312编码。
(2)在Servlet DB中出现乱码的时候,这种情况一般是数据库的字符集设置的不正确。修改数据库的字符集应该就可以解决。在这个过程中JDBC把从Servlet接收到的字符串按照数据库的字符集生成字节流写入到数据库中。
(3)jsp编译,执行的乱码请参照三即可。
(4)Servlet(jsp)浏览器中出现乱码的时候,一般是jsp中的content-type的charset不正确引起的。修改charset即可。
五、结束语
本文在针对jsp系统中常见的乱码问题,通过分析原理,给出了一定的解决方案,总的来说,对于jsp应用中的乱码问题,首先要找出乱码的根本原因,然后才能制定好的解决策,希望本文能使大家对jsp开发有一个更深的理解,同时给jsp的开发者在乱码问题上提供一定帮助。
参考文献:
[1]杨俊峰.轻松解决JSP页面中文乱码[J].才智,2011,23
[2]杨昭兵.基于JSP WEB 动态网页技术中中文乱码问题及解决方案[J].甘肃科技纵横,2010,6
[3]李响,郝静静.Java Web开发中文乱码问题的研究与解决[J].电脑知识与技术,2012,1
关于畜牧业养殖 关于实习生工作计划 关于大学生活总结 关于大一学年个人总结 关于幼师实习工作报告 关于护理实习工作报告 关于未来的作文 关于坚持的作文 关于奉献的演讲稿 关于安全心得体会