问题背景:

因为IDE和Web服务器默认支持的字符编码是ISO-8859-1,从而导致前台页面提交的中文字符串变为乱码,此问题又被分为URL提交参数乱码(get方法提交)和通过表单组件提交乱码(post方法提交)两种,下面分别用橙色字体和绿色字体标注不同情况的解决方法。

 

解决方法:

1.转换字符编码

●优点:无

●缺点:每次使用前所传值前都需要用此方法转换,繁琐,容易产生代码冗余

●示例代码:

String str=request.getParameter("name"); //假设表单元素传来name的值为中文字符

byte b[]=str.getBytes("ISO-8859-1"); //先转换为字节数组

str=new String(b,"GBK"); //转换字符格式为GBK,以上代码再每次调用表单元素传来的值前都要使用

 

2.使用setCharacterEncoding()方法

●优点:代码较方法1少

●缺点:每次使用前所传值前都需要用此方法转换,繁琐,容易产生代码冗余

●示例代码:

request.setCharacterEncoding("GBK");//首先设置request对象接收字符的编码方式为GBK

String str=request.getParameter("name"); //假设表单元素传来name的值为中文字符

 

3.实现Filter接口实现字符格式过滤

●优点:一劳永逸,灵活方便

●缺点:无

●示例代码:

step1:编写一个EncodingFilter.java文件

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;

public class EncodingFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {}

    public void destroy() {}

    public void doFilter(ServletRequest request,
            ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        request.setCharacterEncoding("GBK");
        chain.doFilter(request, response);
    }

}

-------------------------------------------------
step2:在web.xml中增添以下节点

<filter> 

<filter-name>EncodingFilter</filter-name>
    <filter-class>wind.EncodingFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

4.修改Tomcat Server.xml文件

●优点:一劳永逸,灵活方便

●缺点:无

●示例代码:

在Tomcat的config文件夹下server.xml找到如下节点,添加一个"URLEncoding"属性

<Connectorport="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />

错误5.
为什么我的添加的按钮都没有出现乱码,而查询就出现了呢,我反复的看,终于我发现了问题是处在我的查询的URL的链接,大家可以看一下这个链接:sUrl="/workshop/queryMaterial.do?materialcode=" + document.MaterialForm.materialcode.value+"&materialname="+document.MaterialForm.materialname.value;这个是一个典型的method用的是Get的方法,从$TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的URIEncoding属性可以知道,用get方法传递的时候,这个方法你加过滤器和在页面上指定编码都是不可用的,你如果在服务器的server.xml里如果没有配置这一项的时候,采用Get提交的时候,服务器就会默认的是服务器内部的ISO-8859-1的编码,所以JavaScript传递中文出现乱码的问题根本上就是服务器提交时候Get方法和Post方法的不同,所以就导致了乱码的出现。如果你认识到这里,那就有解决的办法了。
具体的解决办法是:
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。不过我为了统一代码的时候我用了UTF-8,结果是中文中有一个字是出现乱码,比如我要是输入中国的时候,我的log就会出现中是正常的,而国是?,后来我改用了字符集,用了GBK就可以搞定。
这样的话就解决了javascript传递中文出现乱码的问题了。实质上就是Form中post和get方法的区别。

在客户端使用
escape()方法对要传递的中文编码

<script>
    var strEN="中文" ;
    window.location.href="Test.aspx?StrValue="escape(strEN);
</script>
在服务器端解码的代码如下:
 string strEN=Microsoft.JScript.GlobalObject.unescape(Request["StrValue"].Trim());

总结了下:3种最可能 产生乱吗
java中,内部使用的是Unicode编码

一 表单提交乱码 :
1,get乱码:
地址栏中传中文乱码的问题:需要设置tomcat , URIEncoding="utf-8"
或者
<%=new String(request.getParameter("name").getBytes("iso-8859-1"), "自己定")%>自己定要支持中文
2,post乱码:
request.setCharacerEncoding("自己定")
或者
<​​%@page​​ contentType="text/html;charset=utf-8"%>中的 charset=utf-8 是设置http的响应(response)中的编码信息

二 页面输出中文时出现乱码:response.setCharacterEncoding("utf-8”)

三 往数据库写入时出现乱码 连接数据库url上添加:useUnicode=true&characterEncoding=utf-8

另外不同的tomcat版本也许默认编码不一样 要做相应调整 。