在网上搜了不少资料都没有搞定 , 通常都有如下几种说法 :javascript
方法 1: 在后台中先得到字符串的 iso-8859-1 编码形式数组 , 再使用此数组实例一个UTF-8编码 形式 String 类型字符串.html
页面提交的 url 为 :java
leavesp?work= 部门主管审批web
后台处理 :数组
String inStr=request.getParameter("work ");tomcat
String outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");app
方法 2: 在页面传递过来时先经过 JavaScript 将 URL 编码 , 再到后台进行解码 :jsp
页面部分 :函数
<script type="text/javascript">post
function dogetMethod(url)
{
//url 编码前 : leavesp?work= 部门主管审批
url=encodeURI(url);
//url 编码后 :
leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9
window.open(uri,’’,’’);
}
</script>
后台部分 :( 解码 )
String inStr= request.getParameter("work ");
String outStr=java.net.URLDecoder.decode(inStr);
尝试过两种方法后好像都不行 , 在后台获取到的字符仍是会乱码 . 试完以后真想哭 .*o*
使用第一种方法后发现 :
在请求 (request) 中得到的字符串是这样的 : ²¿ ÃÅÖ ÷¹ ÜÉ ó Å ú
使用 new String(inStr.getBytes("iso-8859-1"),"UTF-8"); 处理后字符成了 : ����������
无法 , 只能再试第二种方法了 , 使用后发现 :
在页面中使用 encodeURI(url) 后 , 字符串是这样的 :
%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9
好像有但愿了 !!!!
应该只要在后台再来 decoder 一下就好了吧 , 偶是这样想的 , 也是这样作的 :
在后台中 :
String inStr= request.getParameter("work ");
outStr=java.net.URLDecoder.decode(inStr);
在请求中得到的字符串是这样的 : é ¨é¨ä¸»ç®¡å®¡æ¹
decoder 处理后得出的字符串为 : é ¨é¨ä¸»ç®¡å®¡æ¹
这时候真想哭啊 !!%#$%@@!@$$##
革命还没有成功 , 还需努力 !!!
从第二种方法中发现 :
在请求中得到的字符串已经乱码了 , 用 decoder 处不处理值都是一个样 !!
明明我在页面传过来的值是已经 encode 过了的字符 , 然后来取出来却 …., 这是为何呢 ?
难却是页面编码设置得有问题 ?
看了一下页面编码是 : pageEncoding="UTF-8"
改了 ! 改为 : pageEncoding="iso-8859-1" 试试 .
浏览页面上 , 发现页面上的中文变成了不少é æ 之类的字符 , 无论了 , 再试下 , 仍是同样的结果 . 涛声依旧 !
突然想到应该是在得到字符串以前 , 也就是在 request. getParameter("work "); 这以前的某个地方已经将 URL 进行了 decoder, 而且将得到的字符用 Iso-8859-1 的编码方式存储过了 .
因此在 request 中会获得这些相似于é æ 之类的字符 , 这种字符应该就是中文的 iso-8859-1 的形式 !!
有办法了 , 既然已经得到了 iso-8859-1 编码形式的中文 , 那就只要再使用第一种方法(先得到字符串的 iso-8859-1 数组,再将它实例成 UTF-8 的字符串)来进行处理不就 OK 了 !
试过以后果真 OK!!!
处理中文乱码代码实现部分:
jsp 页面:
<%@ page language = "java" pageEncoding = "UTF-8" %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
< head >
< script type = "text/javascript" >
// 开启网页对话脚本
function openDialog(url,width,height)
{
var property= "status:no;center:yes;resizable:yes;scroll:yes;dialogWidth:" +width+ "px;dialogHeight:" +height+ "px;" ;
var ret=window.showModalDialog(url, 'modalDialogwin' ,property);
if (ret == null || ret == "" )
{return false ; }
return true ;
}
// 查看待办工做脚本
function showork(url)
{
// 将 url 地址进行编码
url=encodeURI(url);
//alert(url);
// 调用 openDialog 方法开启网页对话框
openDialog(url,900,500)
}
</ script >
< title > 待办工做查看 </ title >
</ head >
< body >
<!-- 部分代码略 -->
< table border = "1" align = "center" >
< tr >
< td >
< a href = "#" onclick = "javascript:showork('leavesp?work= 部门主管审批 ') "> 查看待办工做 </ a >
</ td >
</ tr >
</ table >
</ body >
</ html >
页面部分就一个超链接,用来开启一个网页对话框,只是开启的这个对话框中请求的不是一个物理的页面,而是请求的一个 servlet ( leavesp ),并且 url 中带有中文参数值( ?work= 部门主管审批 )。
为了处理中文乱码部分可以在整个 WEB 系统中都可以使用到,因此将中文乱码处理写成了一个 Filter( 过滤器 ) ,并在 web.xml 中配置全部的请求都将通过这个 Filter 进行过滤。 Filter 部分的代码以下:
文件名: ProFilter.java
package com.util.filters;
import java.io.IOException;
import java .io.UnsupportedEncodingException;
import java.util.Enumeration;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ProFilter implements Filter
{
protected FilterConfig filterConfig ;
/**
* 初始化
*/
public void init(FilterConfig filterConfig) throws ServletException
{
this . filterConfig =filterConfig;
}
/**
* 将 inStr 转为 UTF - 8 的编码形式
* @param inStr 输入字符串
* @return UTF - 8 的编码形式的字符串
* @throws UnsupportedEncodingException
*/
private String toUTF(String inStr) throws UnsupportedEncodingException
{
String outStr = "" ;
if (inStr != null )
{
//outStr=java.net.URLDecoder.decode(inStr);// 不用 decode 了 , 到这的时候就已经自动 decode 过了
// 将字符串转为 UTF-8 编码形式
outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" );
}
return outStr;
}
/**
* 中文乱码过滤处理
*/
public void doFilter(ServletRequest svlrequest, ServletResponse svlresponse,
FilterChain chain) throws IOException, ServletException
{
// 将 Servlet 请求与响应对象转换成 HttpServlet 请求与响应对象
HttpServletRequest request=(HttpServletRequest)svlrequest;
HttpServletResponse response=(HttpServletResponse)svlresponse;
// 得到请求的方式 (1.post or 2.get), 根据不一样请求方式进行不一样处理
String method = request.getMethod();
//1. 以 post 方式提交的请求 , 直接设置编码为 UTF-8
if (method.equalsIgnoreCase( "post" ))
{
try
{
request.setCharacterEncoding( "UTF-8" );
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
//2. 以 get 方式提交的请求
else
{
// 取出客户提交的参数集
Enumeration<String> paramNames = request.getParameterNames();
// 遍历参数集取出每一个参数的名称及值
while (paramNames.hasMoreElements())
{
String name = paramNames.nextElement(); // 取出参数名称
String values[] = request.getParameterValues(name); // 根据参数名称取出其值
// 若是参数值集不为空
if (values != null )
{
// 若是参数值集中只有一个值
if (values. length == 1)
{
try
{
// 调用 toUTF(values[0]) 函数 ,(values[0] 即第一个参数值 ) 方法转换参数值的字元编码
String vlustr=toUTF(values[0]);
// 并将该值以属性的形式藏在 request
request.setAttribute(name, vlustr);
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
// 若是参数值集中有多个值
else
{
// 遍历参数值集
for ( int i=0;i<values. length ;i++)
{
try
{
// 回圈依次将每一个值调用 toUTF(values[i]) 方法转换参数值的字元编码
String vlustr=toUTF(values[i]);
values[i] = vlustr;
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
// 将该值以属性的形式藏在 request
request.setAttribute(name, values);
}
}
}
}
// 设置响应方式和支持中文的字元集
response.setContentType( "text/html;charset=UTF-8" );
// 继续执行下一个 filter, 无一下个 filter 则执行请求
chain.doFilter(request, response);
}
/**
* 销毁方法
*/
public void destroy()
{
}
}
过滤器部分,可用来处理页面提交的 post 和 get 方法产生的中文乱码问题。
Post 方式提交的数据( form 表单中提交的数据)只须要进行请求字符编码设置 request.setCharacterEncoding( "UTF-8" ); 和响应设置 response.setContentType( "text/html;charset=UTF-8" ); 设置就能够了。
Get 方式提交的数据会包含在 url 中,(如: leavesp?work= 部门主管审批),则须要取出参数名: Enumeration<String> paramNames = request.getParameterNames(); (如: work )和取出参数值: String values[] = request.getParameterValues(name);( 如:部门主管审批 ), 而后再将参数值进行编码转换: outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" );
过滤器写好这后就须要到 web.xml 中 < web-app > 与 </ web-app > 之间进行配置了, web.xml 中配置以下:
<!-- 配置过滤器 -->
< filter >
< description > 处理中文乱码过滤器 </ description >
< filter-name > ProFilter </ filter-name >
< filter-class > com.util.filters.ProFilter </ filter-class >
</ filter >
< filter-mapping >
< filter-name > ProFilter </ filter-name >
< url-pattern > * </ url-pattern ><!-- 过滤全部请求,注: tomcat5 请用 /* -->
</ filter-mapping >
这样配置以后只要页面有任何请求都会经过 ProFilter 进行中文处理了,就不会再发生中文乱码问题了。
那一串经过 get 传递过来的中文处理过程以下:
url=encodeURI(‘ leavesp?work= 部门主管审批 ’)
编码后结果: url= leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9
2.1 得到参数名集合:
Enumeration<String> paramNames = request.getParameterNames();
String name = paramNames.nextElement();
2.1 结果中有 name=’work’ ;一值。
2.2 经过参数名得到参数值:
String values[] = request.getParameterValues(name);
因 work 的值只有一个因此 2.2 的结果为: values[0]=’ é ¨é¨ä¸»ç®¡å®¡æ¹’;( 此处获得的是字符串:“部门主管审批”的 iso-8859-1 编码格式字符 )
2.3 得到字符串的 UTF-8 编码格式字符:
outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" );
2.3 中得到的结果为 outStr= “部门主管审批” .
至此中文已经正常了。
不过过滤器还没处理结束,还得将参数名对应的值 ( 已经处理的值 ) 再从新藏到请求中去。
2.4 将参数名对应结果藏入请求中:
request.setAttribute(name, outStr );
经过 2.4 处理后,请求中的 work 的值就变成了:部门主管审批
2.5 继续执行下一个 filter, 无一下个 filter 则执行请求
chain.doFilter(request, response);
看到这里,你应该也已经会处理中文乱码问题了。赶忙试试!! ^_^
这是我我的处理中文乱码的经验,我将它拿来分享与各位,若是中间有写得不对的地方还请各位帮忙指正。谢谢