日期:2014-05-16  浏览次数:20515 次

JSP 后台乱码
解决Tomcat中文乱码问题之多解决方法 收藏
 

天天写文档,当然也 大多是涉及到技术类的文档,但终究是文档,所以思想上和心理上都有较大的冲击,所以在与我的间接老大沟通以后,在一些方面有豁然开朗的感觉,由此得出一个工作上的经验,总结成一句话,要不又成了“写文档”了,哈哈:工作之中要灵活多变,比如上边让你干什么你不一定一直要去干这一件事情,如果期间遇到很大问题,自己实在力不能及,马上找人请教,要第一时间提出自己对此项工作的建议和意见,一定找到一个最合适的解决问题的方法。
言归正传,切入主题。好久没有做开发了,在暂时摆脱“写文档“之苦之后,自己向另一位老大索要了服务器端的部分程序,自己单机简单配置开发了解熟悉一下,涉及到过程之中出现配置之后,代码之中凡是出现中文地方全是至今世界上都无人认知的语言(乱码----注:这样描述看似毫无必要,但其实暗藏很多人生哲理,总之还是一句话—作任何事情,心态最最重要,每个人要学会自娱自乐,有时候阿Q是最幸福的!),这是因为Eclipse中对Text file encoding的默认编码是GBK,因此,邮件点击你的“工程”,将Info中的“Text file encoding”中的Other改为UTF-8,即可!
另下边是自己整理的关于Tomcat中文乱码的解决方法,从网上整理获得,敬请参考!
(一) JSP设计页面上是中文,但运行时看到的是乱码:
 
解决的办法就是在JSP页面的编码的地方<%@ page language="java" contentType="text/html;charset=GBK" %>,因为Jsp转成Java文件时的编码问题,默认的话有的服务器是ISO-8859-1,如果一个JSP中直接输入了中文,Jsp把它当作ISO8859-1来处理是肯定有问题的,这一点,我们可以通过查看Jasper所生成的Java中间文件来确认。
 
(二) 当用Request对象获取客户提交的汉字代码的时候,会出现乱码,比如表单里:
解决的办法是:要配置一个filter,也就是一个Servelet的过滤器,代码如下:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
publicclass SetCharacterEncodingFilter implements Filter {
publicvoid destroy()
{
}
publicvoid doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)throws IOException, ServletException
{
request.setCharacterEncoding("GBK");
// 传递控制到下一个过滤器
    chain.doFilter(request, response);
}
publicvoid init(FilterConfig filterConfig) throws ServletException
{
}
}
 
 
 配置web.xml
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果你的还是出现这种情况的话你就往下看看是不是你出现了第四中情况,你的Form提交的数据是不是用get提交的,一般来说用post提交的话是没有问题的,如果是的话,你就看看第四中解决的办法。
还有就是对含有汉字字符的信息进行处理,处理的代码是:
package dbJavaBean;
public class CodingConvert
{   
public CodingConvert()
{
         //process
}
 
public String toGb(String uniStr)
{
     String gbStr = "";
     if(uniStr == null)
       {
             uniStr = "";
     }
     try
       {
   byte[] tempByte = uniStr.getBytes("ISO8859_1");
   gbStr = new String(tempByte,"GB2312");
     }
      catch(Exception ex)
      {
              // exception process
     }
     return gbStr;
 }
   
 public String toUni(String gbStr)
 {
     String uniStr = "";
     if(gbStr == null)
       {
            gbStr = "";
     }
     try
       {
   byte[] tempByte = gbStr.getBytes("GB2312");
   uniStr = new String(tempByte,"ISO8859_1");
     }
       catch(Exception ex)
      {
     }
     return uniStr;
}
}
你也可以在直接的转换,首先你将获取的字符串用ISO-8859-1进行编码,然后将这个编码存放到一个字节数组中,然后将这个数组转化成字符串对象就可以了,例如:
String str=request.getParameter(“girl”);
Byte B[]=str.getBytes(“ISO-8859-1”);
Str=new String(B);
通过上述转换的话,提交的任何信息都能正确的显示。
 
(三)在Formget请求在服务端用request. getParameter(“name”)时返回的是乱码;按tomcat的做法设置Filter也没有用或者用request.setCharacterEncoding("GBK");也不管用问题是出在处理参数传递的方法上:如果在servlet中用doGet(HttpServletRequest request, HttpServletResponse response)方法进行处理的话前面即使是写了:
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
也是不起作用的,返回的中文还是乱码!!!如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。
同样,在用两个JSP页面处理表单输入之所以能显示中文是因为用的是post方法传递的,改成get方法依旧不行。
由此可见在servlet中用doGet()方法或是在JSP中用get方法进行处理要注意。这毕竟涉及到要通过浏览器传递参数信息,很有可能引起常用字符集的冲突或是不匹配。
解决的办法是:
1) 打开tomcat的server.xml文件,找到区块,加入如下一行: 
URIEncoding=”GBK” 
完整的应如下: 
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
 enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"
 connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
 
2)重启tomcat,一切OK。
需要加入的原因大家可以去研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的这个文件就可以知道原因了。需要注意的是:这个地方如果你要是用UTF