如果你搞Java web,相信你一定遇到过乱码问题!
通常,你是否是这样处理中文传参的呢?
前台:
url=encodeURI(url);
后台:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
页面:一通UTF-8或GB2312设置编码。
tomcat:统一UTF-8.
然后部署测试发现,乱码啊,你怎么还在纠缠着我!我又不是唐僧,身上更没肉!
乱码问题,是个臭虫!很臭的臭虫!我也遇到过多次,每次都是很纠结,每次都是经过一番转换,然后信誓旦旦地告诉自己和同事,这个乱码我给解决了!有一天,在邮箱里发现测试部提交了一个BUG,说日志里怎么全部是乱码~~~这时候同事们都朝我望过来,我只能满脸黑线|||
最近闲暇下来,看了一些文章,也总结了一些,这里还是比较推崇下面要贴的内容(因为主体还是别人的内容,暂且标为转帖更确切!)。我不清楚乱码问题是否已经根除了,但是我知道现在2轮测试的过程中,再也没有了乱码的踪影,也许她真得消失了?!!我不知道。
好吧,进入内容吧:
=========================================咯咯================================
使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为
1)通过表单取得的中文数据为乱码
2)页面提交中文数据,服务器端接收为乱码
一、初级解决方法
通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行解码转换,然后再按照 gb2312 进行编码,最后得到正确的内容。示例代码如下:
页面传参:http://xxx.do?ptname='我是中国人'
后台转换:
String strPtname = request.getParameter("ptname");
strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");
String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312");
具体的原因是因为美国人在写 tomcat 时默认使用 iso8859-1 进行编码造成的。
Set Character Encoding
filters.SetCharacterEncodingFilter
encoding
EUC_JP
Set Character Encoding
filters.SetCharacterEncodingFilter
encoding
EUC_JP
过滤器的代码如下:
public class SetCharacterEncodingFilter implements Filter {
// 编码的字符串
protected String encoding = null;
// 过滤器的配置
protected FilterConfig filterConfig = null;
// 是否忽略客户端的编码
protected boolean ignore = true;
// 销毁过滤器
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
// 过滤方法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// 如果使用过滤器,忽略客户端的编码,那么使用通过过滤器设定编码
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// 传送给下一个过滤器
chain.doFilter(request, response);
}
// 初始化过滤器
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"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
// 返回过滤器设定的编码
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
public class SetCharacterEncodingFilter implements Filter {
// 编码的字符串
protected String encoding = null;
// 过滤器的配置
protected FilterConfig filterConfig = null;
// 是否忽略客户端的编码
protected boolean ignore = true;
// 销毁过滤器
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
// 过滤方法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// 如果使用过滤器,忽略客户端的编码,那么使用通过过滤器设定编码
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// 传送给下一个过滤器
chain.doFilter(request, response);
}
// 初始化过滤器
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"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
// 返回过滤器设定的编码
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
然而在 tomcat5 中,即使使用过滤器,仍然可能取得乱码,原因何在呢?
并在最后加上useBodyEncodingForURI="true" URIEncoding="UTF-8",如下
在action中:
String s=request.getParameter("s");
s=new String(s.getBytes("iso-8859-1"),"gbk");
六:js的乱码解决
1.客户端:url=encodeURI(url);
服务器:
String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
url=encodeURI(encodeURI(url)); //用了2次encodeURI
这个,是比较推崇的做法,为什么这么做,是有原因的,稍后整理下贴上来~~~
String linename = request.getParameter(name);
//java : 字符解码
linename = java.net.URLDecoder.decode(linename , "UTF-8");