关于JSP乱码问题分析总结

时间:2022-10-14 03:37:52

关于JSP乱码问题分析总结

摘要:在利用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

上一篇:计量管理系统设计与软件开发 下一篇:基于区域性计算机网络专业人才需求预测模型的...