javaweb乱码问题

  相信web站点乱码问题都曾使我们困惑加郁闷不少,在此我积累了几点解决方案,用于解决不同情况下的乱码问题,希望能对各位有些许提示作用。

  首先应确定不是因为浏览器的原因导致中文乱码。

  本人在刚用firefox时就遇到了url中文乱码的问题,找自己程序及配置找了老久也没解决问题,后来才发现原来是浏览器的配置问题。

  问题:编码为utf-8,url 出现乱码。form表单get、post方式都无乱码,页面链接地址也无中文乱码,刷新页面无乱码,但是选中地址栏中的url 敲回车,乱码出现了!

  原因:浏览器配置问题。

  解决方案:ie:“internet选项/高级”中“总以utf-8发送网址”的选项的配置;

  firefox:地址栏中输入about:config,修改network.standard-url.escape-utf8 为False (缺省为True);

  如果你想让浏览器直接url-encode成utf-8,修改network.standard-url.encode-utf8为true(缺省为false)。

  解释:根据Web规范,URL必须以UTF-8字符集进行编码。 而Firefox默认gbk encode,ie默认utf8 encode;另外Firefox对地址中的中文采取了不同于IE的编码方式,也就是说:当url参数值含有中文时firefox默认使用escape进行编码,当参数值没有用escape进行编码时,使用进行解码IE下不会乱码,但Firefox下会乱码。

  附:nverted-to-utf8 * 首选项转换成UTF-8编码格式

  network.standard-url * Standard URL settings

  ok!确认浏览器配置正确后,仍有中文乱码出现,八成儿就是兄弟你代码的问题了,解决方案大概有以下几种。

  1、tomcat服务器配置server.xml文件

  主要用户处理与页面交互时产生的乱码问题,例如提交表单等。

  <!– Define a non-SSL HTTP/1.1 Connector on port 80–><Connector acceptCount=”100″ connectionTimeout=”20000″ disableUploadTimeout=”true” enableLookups=”false” maxHttpHeaderSize=”8192″ maxSpareThreads=”75″ maxThreads=”150″ minSpareThreads=”25″ port=”80″ redirectPort=”8443″ URIEncoding=”GBK” useBodyEncodingForURI=”true” />

  URIEncoding:用来设定通过 URI 传递的内容使用的编码,tomcat 将使用这里指定的编码对客户端传送的内容进行编码。我们通过 get 方法提交的参数实际上都是通过 uri 提交的,由这个参数管理,如果没有设定这个参数,则 tomcat 将使用默认的 iso8859-1 对客户端的内容进行编码。

  useBodyEncodingForURI:使用与 Body 一样的编码来处理 URI, 这个设定是为了与 tomcat4保持兼容,原来在 tomcat4 和 tomcat5 中队参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的,对 get 的处理通过前面的 URIEncoding 进行处理,对 post 的内容依然通过 request.setCharacterEncoding 处理,为了保持兼容,就有了这个设定。

  所以,设置URIEncoding解决get中的参数问题,配置过滤器解决post的参数问题;或者设置useBodyEncodingForURI为true,get、post都使用过滤器来解决参数问题。

  2、数据库bean配置

  主要针对与数据库交互时产生的乱码问题,例如插入中文记录或读取中文数据。

  

  <property name=”driverClassName”><value>com.mysql.jdbc.Driver</value></property><property name=”url”><value>jdbc:mysql://localhost:3306/newfang?useUnicode=true&amp;characterEncoding=gbk&amp;autoReconnect=true</value></property>

  3、代码中局部解决乱码问题

  主要用于解决个别乱码问题,例如网页显示时中文均显示正常除一两条语句外,那么针对这一两条语句的乱码问题可用该方法。

  qString = new String(qString.getBytes(“ISO8859_1”), “GBK”);

  或 qString = URLEncoder.encode(qString, “GBK”); //java url 编码方法

  4、web.xml配置,添加filter过滤器

  用于处理全站乱码问题,其实主要也是用于action与jsp页面交互时使用。

  

  <!– 用于解决中文乱码问题 –><filter><filter-name>Set Character Encoding</filter-name><filter-class>com.qa.util.SetEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param></filter><filter-mapping><filter-name>Set Character Encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>SetEncodingFilter代码:package com.qa.util;import javax.servlet.*;import java.io.*;public class SetEncodingFilter implements Filter{protected String encoding=null;//定义缺省字符编码方式protected boolean ignore=true;//定义客户端指定的编码方式是否应被忽略protected FilterConfig filterConfig=null;//定义过滤器配置对象,若为null,则说明过滤器未配置public void destroy()//停止过滤器的工作{this.encoding=null;this.filterConfig=null;}//设置字符编码public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)throws IOException,ServletException{if(ignore||(req.getCharacterEncoding()==null)){req.setCharacterEncoding(selectEncoding(req));}chain.doFilter(req,res);}//启动过滤器public void init(FilterConfig filterConfig)throws ServletException{this.filterConfig=filterConfig;this.encoding=filterConfig.getInitParameter(“encoding”);String value=filterConfig.getInitParameter(“ignore”);if(value==null) this.ignore=true;else if(value.equalsIgnoreCase(“true”)||value.equalsIgnoreCase(“yes”)) this.ignore=true;else this.ignore=false;}//选择合适的字符编码方式protected String selectEncoding(ServletRequest req){return this.encoding;}//返回filterConfig对象public FilterConfig getFilterConfig(){return filterConfig;}//设置filterConfig对象public void setFilterConfig(FilterConfig filterConfig){this.filterConfig=filterConfig;}}

  5、服务器apache上的乱码。

  除了以上的情况外,还有apache的配置问题,注意的方面有以下几点:

  1)conf/

  把AddDefaultCharset ISO-8859-1 改成 AddDefaultCharset GBK

  2)apache进行了rewrite

  把需要rewrite的url中的中文参数进行两次编码(encode),因为apache在rewrite时会做一次url解码,这时jk进行请求转发时,就不会再是编码后的字符串了;

  或者在接收请求时先用ISO-8859-1取字节流,再使用UFT-8来new String。(new String(str.getBytes(“ISO-8859-1″),”UFT-8”))

人,总是很难改正自己的缺点,

javaweb乱码问题

相关文章:

你感兴趣的文章:

标签云: