中文乱码问题解决.docx
《中文乱码问题解决.docx》由会员分享,可在线阅读,更多相关《中文乱码问题解决.docx(14页珍藏版)》请在冰豆网上搜索。
中文乱码问题解决
在网上搜了很多资料都没有搞定,一般都有以下几种说法:
方法1:
在后台中先获得字符串的iso-8859-1编码形式数组,再使用此数组实例一个UTF-8编码形式String类型字符串.
页面提交的url为:
leavesp?
work=部门主管审批
后台处理:
StringinStr=request.getParameter("work");
StringoutStr=newString(inStr.getBytes("iso-8859-1"),"UTF-8");
方法2:
在页面传递过来时先通过JavaScript将URL编码,再到后台进行解码:
页面部分:
functiondogetMethod(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,’’,’’);
}
后台部分:
(解码)
StringinStr=request.getParameter("work");
StringoutStr=.URLDecoder.decode(inStr);
尝试过两种方法后好像都不行,在后台获取到的字符还是会乱码.试完之后真想哭.*o*
使用第一种方法后发现:
在请求(request)中获得的字符串是这样的:
²¿ÃÅÖ÷¹ÜÉóÅú
使用newString(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一下就行了吧,偶是这样想的,也是这样做的:
在后台中:
StringinStr=request.getParameter("work");
outStr=.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页面:
<%@pagelanguage="java"pageEncoding="UTF-8"%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
//开启网页对话脚本
functionopenDialog(url,width,height)
{
varproperty="status:
no;center:
yes;resizable:
yes;scroll:
yes;dialogWidth:
"+width+"px;dialogHeight:
"+height+"px;";
varret=window.showModalDialog(url,'modalDialogwin',property);
if(ret==null||ret=="")
{returnfalse;}
returntrue;
}
//查看待办工作脚本
functionshowork(url)
{
//将url地址进行编码
url=encodeURI(url);
//alert(url);
//调用openDialog方法开启网页对话框
openDialog(url,900,500)
}
待办工作查看
--部分代码略-->
showork('leavesp? work=部门主管审批')">查看待办工作
|
页面部分就一个超连接,用来开启一个网页对话框,只是开启的这个对话框中请求的不是一个物理的页面,而是请求的一个servlet(leavesp),而且url中带有中文参数值(?
work=部门主管审批)。
为了处理中文乱码部分能够在整个WEB系统中都能够使用到,所以将中文乱码处理写成了一个Filter(过滤器),并在web.xml中配置所有的请求都将经过这个Filter进行过滤。
Filter部分的代码如下:
文件名:
ProFilter.java
packagecom.util.filters;
importjava.io.IOException;
importjava.io.UnsupportedEncodingException;
importjava.util.Enumeration;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassProFilterimplementsFilter
{
protectedFilterConfigfilterConfig;
/**
*初始化
*/
publicvoidinit(FilterConfigfilterConfig)throwsServletException
{
this.filterConfig=filterConfig;
}
/**
*将inStr转为UTF-8的编码形式
*@paraminStr输入字符串
*@returnUTF-8的编码形式的字符串
*@throwsUnsupportedEncodingException
*/
privateStringtoUTF(StringinStr)throwsUnsupportedEncodingException
{
StringoutStr="";
if(inStr!
=null)
{
//outStr=.URLDecoder.decode(inStr);//不用decode了,到这的时候就已经自动decode过了
//将字符串转为UTF-8编码形式
outStr=newString(inStr.getBytes("iso-8859-1"),"UTF-8");
}
returnoutStr;
}
/**
*中文乱码过滤处理
*/
publicvoiddoFilter(ServletRequestsvlrequest,ServletResponsesvlresponse,
FilterChainchain)throwsIOException,ServletException
{
//将Servlet请求与响应对象转换成HttpServlet请求与响应对象
HttpServletRequestrequest=(HttpServletRequest)svlrequest;
HttpServletResponseresponse=(HttpServletResponse)svlresponse;
//获得请求的方式(1.postor2.get),根据不同请求方式进行不同处理
Stringmethod=request.getMethod();
//1.以post方式提交的请求,直接设置编码为UTF-8
if(method.equalsIgnoreCase("post"))
{
try
{
request.setCharacterEncoding("UTF-8");
}catch(UnsupportedEncodingExceptione)
{
e.printStackTrace();
}
}
//2.以get方式提交的请求
else
{
//取出客户提交的参数集
EnumerationparamNames=request.getParameterNames();
//遍历参数集取出每个参数的名称及值
while(paramNames.hasMoreElements())
{
Stringname=paramNames.nextElement();//取出参数名称
Stringvalues[]=request.getParameterValues(name);//根据参数名称取出其值
//如果参数值集不为空
if(values!
=null)
{
//如果参数值集中只有一个值
if(values.length==1)
{
try
{
//调用toUTF(values[0])函数,(values[0]即第一个参数值)方法转换参数值的字元编码
Stringvlustr=toUTF(values[0]);
//并将该值以属性的形式藏在request
request.setAttribute(name,vlustr);
}catch(UnsupportedEncodingExceptione)
{
e.printStackTrace();
}
}
//如果参数值集中有多个值
else
{
//遍历参数值集
for(inti=0;i{
try
{
//回圈依次将每个值调用toUTF(values[i])方法转换参数值的字元编码
Stringvlustr=toUTF(values[i]);
values[i]=vlustr;
}catch(UnsupportedEncodingExceptione)
{
e.printStackTrace();
}
}
//将该值以属性的形式藏在request
request.setAttribute(name,values);
}
}
}
}
//设置响应方式和支持中文的字元集
response.setContentType("text/html;charset=UTF-8");
//继续执行下一个filter,无一下个filter则执行请求
chain.doFilter(request,response);
}
/**
*销毁方法
*/
publicvoiddestroy()
{
}
}
过滤器部分,可用来处理页面提交的post和get方法产生的中文乱码问题。
Post方式提交的数据(form表单中提交的数据)只需要进行请求字符编码设置request.setCharacterEncoding("UTF-8");和响应设置response.setContentType("text/html;charset=UTF-8");设置就可以了。
Get方式提交的数据会包含在url中,(如:
leavesp?
work=部门主管审批),则需要取出参数名:
EnumerationparamNames=request.getParameterNames();(如:
work)和取出参数值:
Stringvalues[]=request.getParameterValues(name);(如:
部门主管审批),然后再将参数值进行编码转换:
outStr=newString(inStr.getBytes("iso-8859-1"),"UTF-8");
过滤器写好这后就需要到web.xml中与之间进行配置了,web.xml中配置如下:
--配置过滤器-->
处理中文乱码过滤器
ProFilter
com.util.filters.ProFilter
ProFilter
*
--过滤所有请求,注:
tomcat5请用/*-->
这样配置之后只要页面有任何请求都会通过ProFilter进行中文处理了,就不会再发生中文乱码问题了。
那一串通过get传递过来的中文处理过程如下:
1. 在jsp页面的JavaScript里面进行编码处理:
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. 因为在web.xml过滤器配置为*所以所有请求将会通过过滤器进行处理,此过滤器处理过程如下:
2.1获得参数名集合:
EnumerationparamNames=request.getParameterNames();
Stringname=paramNames.nextElement();
2.1结果中有name=’work’;一值。
2.2通过参数名获得参数值:
Stringvalues[]=request.getParameterValues(name);
因work的值只有一个所以2.2的结果为:
values[0]=’部门主管审批’;(此处得到的是字符串:
“部门主管审批”的iso-8859-1编码格式字符)
2.3获得字符串的UTF-8编码格式字符:
outStr=newString(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);
3. 通过过滤器之后,就可以进入请求中对应leavesp的servlet了(servlet就不做说明了),此时在servlet中通过Stringwork=request.getParameter(“work”);就可以获得url中传递过来的中文参数值了,结果为work=”部门主管审批”。
看到这里,你应该也已经会处理中文乱码问题了。
赶紧试试!
!
^_^
这是我个人处理中文乱码的经验,我将它拿来分享与各位,如果中间有写得不对的地方还请各位帮忙指正。
谢谢。